Использование srand(time(NULL))
кажется чрезмерно детерминированным. Например, когда я запускаю std::cout << rand() % 9000
, я получаю 4275. Когда я запускаю его снова, я получаю 4311. Это тоже зависит от времени.
rand () семя, которое не требует времени?
Ответы (3)
Если вы используете C ++, я бы рекомендовал использовать <random>
из стандартной библиотеки. Это намного надежнее, чем rand()
<random>
был добавлен как часть TR1, поэтому он также доступен в <tr1/random>
как std::tr1::mt19937
и т. Д.
- person Praetorian; 02.06.2014
Проблема с вашим подходом заключается в том, что вы просто берете две выборки и предполагаете, что они репрезентативны для всей генеральной совокупности (то есть: статистическая ошибка, основанная на незначительном размере выборки). Функция rand()
возвращает значения, которые эффективно образуют равномерное распределение на [0, RAND_MAX]
. Приведенный вами пример не очень удачный.
Во-вторых, вызов srand(time(NULL))
- это неплохой подход на большинстве современных машин. Единственный раз, когда это представляет значительную угрозу безопасности, - это работа на одноядерном встроенном чипе, у которого нет резервного аккумулятора для системных часов. Я работал с некоторыми платами Motorola, которые делают это, и примерно в 90% случаев, когда наша программа загружалась, мы получали такое же случайное начальное значение. Я считаю, что некоторые машины Бинго в 80-х были уязвимы для этого, поскольку они были разработаны для работы круглосуточно, без выходных, но операторы выключали их каждую ночь.
Наконец, rand()
в лучшем случае наполовину приличен. Если вам нужен генератор случайных чисел с лучшими свойствами (то есть: «близкие» начальные значения, не обеспечивающие аналогичный шаблон, более широкий диапазон выходных значений, минимальное смещение), рассмотрите возможность использования внешнего алгоритма ГСЧ.
Ссылки
- Рекомендуемый способ инициализации srand?, дата обращения 02.06.2014,
<https://stackoverflow.com/questions/322938/recommended-way-to-initialize-srand>
- Какая разница между функциями rand () и random ()?, дата обращения 02.06.2014, _ 6_
- Какие существуют альтернативы функциям rand () и srand () библиотеки C?, дата обращения 02.06.2014, _ 7_
Если по какой-то причине вы застряли при использовании rand()
, попробуйте удалить из него несколько значений после вызова srand
. Корреляция максимальна при первом вызове rand
и с этого момента уменьшается.
srand(time(NULL));
rand();
rand();
Вы также можете заполнить его, используя значение из /dev/random
или /dev/urandom
(или Windows эквивалент.
rand
. Если вы используете ГПСЧ, который не отстой, он будет выводить совершенно разные последовательности, даже если входные данные очень похожи. Даже с идеальными семенамиrand
имеет ужасные недостатки, включая недостаточный размер семян и размер. - person CodesInChaos   schedule 02.06.2014srand((time.tv_sec * 1000) + (time.tv_usec / 1000))
в принятом ответе. - person Csq   schedule 02.06.2014rand
. Используемая формула показывает определенную корреляцию между семенами и первым произведенным значением. - person Mark Ransom   schedule 02.06.2014std::random_device
как часть новой библиотеки<random>
. Для старых компиляторов (до C ++ 11) вы можете использовать случайную библиотеку TR1 или Boost.Random, которые почти одинаковы. В противном случае вы также можете читать из/dev/random
или/dev/urandom
или их эквивалента, отличного от Unix (?). - person Mikael Persson   schedule 02.06.2014