Я научился сначала засеивать генератор случайных чисел srand(time(NULL))
, а затем использовать вызовы rand()
для генерации случайных чисел. Проблема с этим подходом в том, что если я запускаю свою программу несколько раз за одну секунду, сгенерированные случайные числа всегда будут одинаковыми. Что можно сделать в этом направлении?
Как лучше всего использовать srand ()?
Ответы (5)
В системах POSIX используйте clock_gettime
, чтобы получить текущее время в наносекундах. Если вам не нужно много битов, вы можете просто забыть о ГПСЧ и напрямую использовать младшие биты времени в качестве случайного числа. :-)
int pid ; // get it as per your OS
timeval t;
gettimeofday(&t, NULL);
srand(t.tv_usec * t.tv_sec * pid);
time дает вам значения, основанные на second
. gettimeofday основан на microseconds
. Так что меньше шансов на то, что произойдет то же самое семя. Кроме того, вы также используете идентификатор процесса.
Если * nix, почему не читаете прямо с /dev/random
?
Также вы можете собирать шум от других устройств, таких как клавиатура, мышь или температура процессора.
Вы можете использовать акселерометр и использовать его для сбора шума от морских волн. Ветер тоже производит шум.
Я считаю, что Glib предоставляет функцию g_random_int()
, которая производит случайные числа, равномерно распределенные, быстрым и переносимым способом.
Или вы можете просто прочитать количество временных файлов в /tmp
и использовать это количество для подачи srand()
функцией time.h
или прочитать содержимое одного файла в /tmp
.
Вы можете прочитать каждый файл из /usr/bin
или /
и собрать немного еды для srand()
.
Помимо использования времени, еще один распространенный способ засеять вашу функцию rand - использовать идентификатор процесса вашей программы, поскольку он гарантированно уникален.
Фактический код зависит от платформы, но если вы работаете в Windows, я считаю, что вы можете использовать функцию GetCurrentProcessId()
, как в
srand(GetCurrentProcessId());
rand
.
- person prehistoricpenguin; 06.04.2013
Помимо ввода времени, вы можете добавить к нему время процессора, что, как я считаю, можно сделать с помощью clock (). Это будет выглядеть так: srand(time() + clock())
.
GetTickCount
. * nix имеет clock_gettime. - person chris   schedule 06.04.2013stime(time(NULL) * getpid())
, например, это поможет. - person Havenard   schedule 06.04.2013