Почему мои случайные числа всегда одинаковы?
Я использую подпрограмму random_number
из Fortran, но в разных прогонах программы число, которое производится, не изменяется. Что я должен включить в свой код, поэтому каждый раз, когда я компилирую и запускаю программу, цифры меняются?
- Уникальные случайные числа в целочисленном массиве на языке программирования C
- Взвешенный случайный выбор из массива
- Как работает генератор случайных чисел?
- Случайное число на большом расстоянии, так ли?
- Произвольное генерирование букв в соответствии с их частотой использования?
- Возьмите n случайных элементов из списка ?
- Почему class System.Random не статичен?
- генерировать случайные двойные числа в c ++
Генератор случайных чисел генерирует псевдослучайные числа. Чтобы получить разные числа на каждом прогоне, вам необходимо ввести в действие случайное семя в начале вашей программы. Это выбирает другую начальную позицию в псевдослучайном streamе.
Последовательность псевдослучайных чисел, поступающих от вызова (-ов) к random_number
зависит от алгоритма, используемого процессором, и значения семени.
Начальное значение семян зависит от процессора. Для некоторых процессоров это начальное значение будет одинаковым при каждом запуске программы, а для некоторых это будет другим. Первый случай дает повторяемую псевдослучайную последовательность, а вторую – неповторяющуюся последовательность.
gfortran (до версии 7) попадает в эту первую категорию. Таким образом, вам нужно будет явно изменить случайное семя, если вы хотите получить неизменяемые последовательности.
Как указано в другом ответе, встроенное random_seed
может использоваться для установки значения семени и перезапуска псевдослучайного генератора. Опять же, это зависит от процессора, что происходит, когда вызов call random_seed()
(то есть без аргумента put=
). Некоторые процессоры будут перезапускать генератор с повторяемой последовательностью, а некоторые – нет. gfortran (опять же, до версии 7) находится в первой категории.
Для процессоров, где call random_seed()
приводит к повторяющейся последовательности, для генерации отдельных последовательностей потребуется явное переменное семя время выполнения. Пример для старых версий gfortran можно найти в документации .
Следует отметить, что выбор семени может быть сложной задачей. Мало того, что будут проблемы с переносимостью, но может потребоваться помощь в обеспечении того, чтобы генератор не перезапускался в области с низкой энтропией. Для программ с несколькими изображениями пользователь должен будет работать с разными последовательностями на этих изображениях.
random_init
в проекте стандарта Fortran 2018 есть предложение для встроенного random_init
. Это обрабатывает оба случая выбора повторяемости по вызовам и различиям над (coarray) изображениями.