У меня есть приложение C++, которое вызывает rand() в разных местах. Нужно ли мне регулярно инициализировать srand()
, чтобы rand() был достаточно случайным, или достаточно вызвать его один раз при запуске приложения?
Как часто следует вызывать srand() в приложении C++?
Ответы (4)
Если у вас есть только одна цепочка, заполните один раз. Если вы часто выполняете повторное заполнение, вы можете нарушить некоторые статистические свойства случайных чисел. Если у вас есть несколько потоков, вообще не используйте rand
, а используйте что-то вроде потокобезопасного типа drand48_r
, которое позволяет вам поддерживать состояние для каждого потока (так что вы можете заполнить один раз для каждого потока).
<random>
. Их просто немного сложнее настроить, поэтому я подумал, что отвечаю в духе вопроса - но на самом деле, используйте <random>
, если можете!
- person Kerrek SB; 05.08.2011
Только один раз, в начале вашего приложения.
Нет, просто позвонить один раз — это нормально. Используйте начальное значение, чтобы сделать случайную последовательность одинаковой при каждом выполнении. Это может быть полезно, например, для создания детерминированного поведения игры, когда вы воспроизводите ее для отладки.
вызовите его один раз, когда приложение запустится
srand
не делаетrand
более случайным. Это никоим образом не гарантирует разумной случайности. Он просто заставляет последовательность случайных чисел начинаться с указанной точки. - person jalf   schedule 05.08.2011rand()
является линейным конгруэнтным генератором, и, как их иллюстрация показывает, что новое начальное число, если оно не совпадает с числом, которое генератор выдал бы с предыдущим начальным числом, приведет к другой последовательности чисел. Однако, если семя совпадает, меняется только начальная точка. - person Theo d'Or   schedule 19.01.2020rand()
больше не является простым линейным конгруэнтным генератором. - person Theo d'Or   schedule 19.01.2020