Почему это происходит, когда я вызываю srand() в 2 очень разных точках, это приводит к тому, что числа не являются случайными? Как только я удалю один из них, он вернется к нормальному состоянию.Вызов srand() дважды в той же программе
ответ
Это зависит от того, как вы это называете. Целью srand()
является заселение генератора псевдослучайных чисел, используемого rand()
. Поэтому, когда вы вызываете srand(i)
, он будет инициализировать rand()
фиксированной последовательности, которая зависит от i
. Поэтому, когда вы повторно семена с тем же семенем, вы начинаете получать одну и ту же последовательность.
Наиболее распространенным вариантом использования является размножение генератора только один раз и с подходящим «случайным» значением (например, идиоматический time(NULL)
). Это гарантирует, что делает вероятным, что вы получите разные последовательности псевдослучайных чисел в разных исполнениях программы.
Однако иногда вы можете хотите, чтобы сделать псевдослучайную последовательность «воспроизводимой». Представьте, что вы тестируете несколько алгоритмов сортировки по случайным данным. Чтобы получить справедливые сравнения, вы должны протестировать каждый алгоритм по точно таким же данным, чтобы вы повторно запустили генератор с тем же семенем перед каждым прогоном.
Другими словами: если вы хотите, чтобы числа просто псевдослучайные, семя один раз и со значением как можно более случайным. Если вам нужен какой-то контроль & повторность, семя при необходимости.
Вы инициализируете srand? Вы должны инициализировать его в начале вы действуете/код вроде этого:
srand(time(NULL));
Он должен работать :)
И что, по-вашему, происходит, когда вы вызываете 'srand (time (NULL));' позже в той же программе, достаточно скоро, что 'time (NULL)' возвращает то же самое значение, что и в первый раз? – hvd
Ну, в конечном итоге это будет, но я предположил, что его программа не очень сложная. – falkon21
"В конечном счете"? Я не имел в виду, что счетчик переполняется через несколько дней, я имел в виду вызов «время (NULL)» дважды в одну секунду (или любой другой элемент 'time_t' для конкретной системы). Особенно, если программа не сложная, полный запуск программы не требуется даже секунды. – hvd
srand (seed);
Два разной инициализации с тем же семенем будет генерировать же последовательность результатов в последующих вызовах рандов.
Если семя установлено в 1, генератор повторно инициализируется до его начального значения и производит те же значения, что и перед любым вызовом rand или srand.
Каждый раз, когда rand() засевается srand(), он должен производить последовательность значений .
Вы можете прочитать о псевдо-случайных чисел генераторы, стандартные библиотечные функции srand-Rand являются реализация одного из них. Основная идея заключается в том, что псевдослучайный генератор инициализируется специальным числом - семенем. srand() используется для установки семени. Для каждого семенного псевдослучайного генератора генерируется точно такая же последовательность чисел. Используя разные семена, вы получите разные последовательности чисел. Итак, если вы хотите получать разные случайные числа каждый раз, когда вы начинаете свою программу, вам нужно каждый раз устанавливать новое семя. Один из самых простых способов сделать это - использовать время для семян.
#include <time.h>
srand((unsigned int)time(0));
- 1. Вызов другого файла xml в той же программе: android
- 2. вызов директивы дважды используется в той же области
- 3. Вызов System.loadLibrary дважды для одной и той же общей библиотеки
- 4. Вызов одной и той же функции дважды - JavaScript
- 5. вызов той же функции дважды с различными параметрами ocaml
- 6. MYSQL избежать вставки той же строки дважды
- 7. Как повторить функцию в той же программе
- 8. scanf и fgets в той же программе
- 9. sendto и recvfrom в той же программе?
- 10. Можно ли назвать метод запуска дважды в той же теме?
- 11. Назовите тот же самый javascript дважды на той же странице
- 12. Исинхронные и синхронные вызовы функций в той же программе node.js
- 13. Повторный вызов той же AsyncTask
- 14. извлечения той же колонке дважды из таблицы
- 15. блокировка одной и той же таблицы дважды
- 16. Двойной JOIN с той же таблицей дважды
- 17. MySql присоединиться к той же таблице дважды
- 18. Выбор информации из той же таблицы дважды
- 19. typedef используется на той же структуре дважды
- 20. Shortcode дважды на той же странице Wordpress
- 21. ISNULL дважды для той же колонки
- 22. печатать изображение дважды на той же странице
- 23. Смешивание COUT и wcout в той же программе
- 24. Вызов строки чтения Swift для одной и той же переменной дважды игнорирует второй вызов
- 25. Вызов той же функции в разных классах
- 26. Вызов той же функции в setTimeout
- 27. srand (0) и srand (1) дают те же результаты?
- 28. Загрузить ту же карту ACF дважды на той же странице
- 29. Используйте Enter для отправки дважды на той же странице
- 30. Выбор из той же таблицы дважды с результатами в той же строке
Вам нужно будет показать код, демонстрирующий, что вы имеете в виду, а также описать, что вы подразумеваете под «не случайным».'rand()' является генератором * pseudo * -случайных чисел; последовательность чисел, которые он генерирует, полностью определяется самым последним вызовом 'srand()'. – Sneftel