Использование функции srand.
Местоположение функции - библиотека stdlib.h.
Функция srand устанавливает начальную точку для генерации случайных чисел и обладает следующим синтаксисом:
void srand(unsigned int start) |
Параметр start, который принимает функция, и есть - новая точка для генерации случайного числа. Давайте подумаем, какое же число вписать на место этого параметра. Целочисленный литерал или переменная, значение которой опредленно в момент написания программы - не подходят. Передав их на место отправной точки мы непременно изменим ее, но не сделаем динамической. И, числа будут генерироваться другие, но все еще одинаковые при каждом запуске.
Примеры программ с использованием литерала и переменной в качестве отправной точки:
#include <iostream>
#include <stdlib.h> //в этом файле содержится функция rand
using namespace std;
void main ()
{
srand(10);
int i=rand(); //генерация случайного числа и запись его в переменную i
cout << i << "\n";
cin.get();
cin.get();
}
#include <iostream>
#include <stdlib.h> //в этом файле содержится функция rand
using namespace std;
void main ()
{
int a = 10;
srand(a);
int i=rand(); //генерация случайного числа и запись его в переменную i
cout << i << "\n";
cin.get();
cin.get();
}
Результат и там и там - одинаковый!!!
В программе использован тип unsigned, что является сокращением от unsigned int. Число типа int занимает при хранении по меньшей мере два байта (четыре байта на современных популярных 32-битных системах) и может принимать как положительные, так и отрицательные значения. Переменная типа unsigned int также хранится по крайней мере в двух байтах памяти. Двухбайтовое число unsigned int может принимать только неотрицательные значения в диапазоне 0-65535. Четырехбайтовое unsigned int может принимать неотрицательные значения в диапазоне 0-4294967295. Функция srand получает в качестве аргумента unsigned int.
Еще один пример с использованием функции srand (), используя в качестве отправной точки некоторое введенное число с клавиатуры:
#include <iostream>
#include <iomanip>
#include <stdlib.h> //в этом файле содержится функция rand
using namespace std;
void main ()
{
setlocale (LC_CTYPE, "russian");
unsigned a; // хранит введенное пользователем отправную точку
cout << "Введите отправную точку: ";
cin >> a;
srand(a); // засеять генератор случайных чисел
for (int i=1; i<=20; i++)
{
cout << setw(5) << (1+rand()%6); //получить случайное число от 1 до 6 и вывести его
if ( i%5 == 0 ) // если counter делится на 5, начать новую строку вывода
cout << endl;
}
cin.get();
cin.get();
}
Введите отправную точку: 1
6 6 5 5 6
5 1 1 5 3
6 6 2 4 2
6 2 3 4 1
Для продолжения нажмите любую клавишу . . .
Введите отправную точку: 2
4 3 1 6 1
1 5 2 2 5
2 2 5 1 6
4 6 2 5 6
Для продолжения нажмите любую клавишу . . .
Введите отправную точку: 1
6 6 5 5 6
5 1 1 5 3
6 6 2 4 2
6 2 3 4 1
Для продолжения нажмите любую клавишу . . .
В случаях введения одинаковых чисел (в 1 и 3 вводе) в качестве отправной точки – у нас будет одинаковый ряд «случайных чисел».
Типичная ошибка программирования
Использование srand вместо rand при попытке генерации случайных чисел приводит к ошибке компиляции, поскольку функция srand не возвращает значения.
Если производить рандомизацию, не вводя каждый раз значения семени, можно написать оператор вроде srand( time( 0 ) ) ;
Тогда для автоматического получения семени компьютер будет считывать показания своих часов. Функция time (с аргументом 0, как написано в приведенном операторе) текущее время как число секунд, прошедших с полуночи 1 января 1970 года по Гринвичу (GMT). Это значение преобразуется в целое типа unsigned и используется в качестве семени генератора случайных чисел. Прототип функции time находится в <time.h>.
Использование функции time.
Местоположение функции - библиотека time.h.
У функции time есть несколько предназначений и подробно разбирать мы ее не будем. Возьмем только то, что необходимо нам для работы. А, именно, если функцию time вызвать с параметром NULL, то на место своего вызова в программе, эта функция вернет количество миллисекунд прошедших с 1 января 1970 года. Согласитесь, что эта величина каждый раз будет разной. А, это - как раз то, что мы искали. "Соберем" полученную информацию в единое целое и получится:
Идентичные записи:
srand ((unsigned int) time(NULL));
srand ((unsigned int) time(0));
srand ((unsigned) time(NULL));
srand (time(0));
Функция srand устанавливает в качестве стартовой точки число, представляющее собой количество, миллисекунд прошедших с 1 января 1970 года. Попробуем:
#include <iostream>
#include <time.h>
#include <stdlib.h> //в этом файле содержится функция rand
using namespace std;
void main ()
{
srand((unsigned) time(0));
int i=rand(); //генерация случайного числа и запись его в переменную i
cout << i << "\n";
cin.get();
cin.get();
}
Набрав исправленный пример, вы, конечно, убедились, что теперь при разных запусках программы генерируются разные числа.
