Я пытаюсь привести пример диалога с основным файлом из здесь , особенно с настройкой экспериментального кода. Наблюдая за наблюдением, я бы сказал, что rand (), кажется, дает то же самое ...
Мне очень нравится, что я могу генерировать один и тот же набор псевдослучайных данных многократно, особенно с настройкой экспериментального кода. Наблюдая за наблюдением, я бы сказал, что rand ()
, кажется, каждый раз дает одну и ту же последовательность чисел *.
Гарантируется ли это делать для повторных выполнений на одной и той же машине / для разных машин / для разных архитектуры? 1284 * Очевидно, что для того же семени.
Да, учитывая ту же среду для программы. Из стандарта C §7.20.2.2 / 2,
Функция
srand
использует аргумент в качестве начального числа для новой последовательности псевдослучайных чисел, возвращаемых последующими вызовамиrand
. Если затем вызываетсяsrand
с тем же начальным значением, последовательность псевдослучайных чисел должна быть повторена. Еслиrand
вызывается до того, как будут выполнены какие-либо вызовыsrand
, должна быть сгенерирована та же последовательность, что и при первом вызовеsrand
с начальным значением of 1.
Конечно, это предполагает, что используется одна и та же деталь реализации (то есть та же машина, та же библиотека в тот же период выполнения). Стандарт C не требует стандартного алгоритма генерации случайных чисел, поэтому, если вы запустите программу с другой стандартной библиотекой C, можно получить другую последовательность случайных чисел.
См. Вопрос Согласованные псевдослучайные числа на разных платформах , если вам нужна переносимая и гарантированная последовательность случайных чисел с заданным начальным числом.
Гарантируется предоставление той же последовательности для одного и того же начального числа, переданного в srand ()
, но только на время однократного выполнения программа . В общем, если у реализации есть выбор в поведении, нет особых требований, чтобы этот выбор оставался неизменным при последующих выполнениях.
Реализация будет соответствовать выбору «главного начального числа» при каждом запуске программы и использовать его для возмущения генератора псевдослучайных чисел способом, который будет отличаться при каждом запуске программы.
Если вы хотите большего детерминизма, вам следует реализовать в программе ГПСЧ с определенными параметрами.
Нет.
Стандарт C говорит:
Если srand затем вызывается с тем же начальное значение, последовательность псевдослучайные числа должны быть повторяется.
Но нигде не сказано, что такое последовательность псевдослучайных чисел на самом деле - поэтому она различается в разных реализациях.
Единственная гарантия заключается в том, что rand ()
выдаст ту же последовательность чисел для данного начального числа для данной реализации . Нет гарантии, что последовательность будет одинаковой на разных машинах или в разных архитектурах - и почти наверняка не будет.
Если вам нужно использовать точно такой же набор псевдослучайных чисел в экспериментальных целях, вы можете использовать srand
для генерации длинной последовательности случайных чисел. числа и записать их в файл / базу данных. Затем напишите портативную функцию «генератора случайных чисел», которая последовательно возвращает значения из этого файла. Таким образом, вы можете быть уверены, что используете одни и те же входные данные независимо от платформы, реализации srand
или начального значения.
При переключении на другую машину / среду выполнения / что-то еще, возможно, вам не повезло. Существует еще один возможный выбор семейства функций drand48
. Они нормализованы для использования одного и того же алгоритма на всех машинах.