Почему мои случайные числа всегда одинаковы?

Я использую подпрограмму random_number из Fortran, но в разных прогонах программы число, которое производится, не изменяется. Что я должен включить в свой код, поэтому каждый раз, когда я компилирую и запускаю программу, цифры меняются?

Генератор случайных чисел генерирует псевдослучайные числа. Чтобы получить разные числа на каждом прогоне, вам необходимо ввести в действие случайное семя в начале вашей программы. Это выбирает другую начальную позицию в псевдослучайном streamе.

Последовательность псевдослучайных чисел, поступающих от вызова (-ов) к random_number зависит от алгоритма, используемого процессором, и значения семени.

Начальное значение семян зависит от процессора. Для некоторых процессоров это начальное значение будет одинаковым при каждом запуске программы, а для некоторых это будет другим. Первый случай дает повторяемую псевдослучайную последовательность, а вторую – неповторяющуюся последовательность.

gfortran (до версии 7) попадает в эту первую категорию. Таким образом, вам нужно будет явно изменить случайное семя, если вы хотите получить неизменяемые последовательности.

Как указано в другом ответе, встроенное random_seed может использоваться для установки значения семени и перезапуска псевдослучайного генератора. Опять же, это зависит от процессора, что происходит, когда вызов call random_seed() (то есть без аргумента put= ). Некоторые процессоры будут перезапускать генератор с повторяемой последовательностью, а некоторые – нет. gfortran (опять же, до версии 7) находится в первой категории.

Для процессоров, где call random_seed() приводит к повторяющейся последовательности, для генерации отдельных последовательностей потребуется явное переменное семя время выполнения. Пример для старых версий gfortran можно найти в документации .

Следует отметить, что выбор семени может быть сложной задачей. Мало того, что будут проблемы с переносимостью, но может потребоваться помощь в обеспечении того, чтобы генератор не перезапускался в области с низкой энтропией. Для программ с несколькими изображениями пользователь должен будет работать с разными последовательностями на этих изображениях.

random_init в проекте стандарта Fortran 2018 есть предложение для встроенного random_init . Это обрабатывает оба случая выбора повторяемости по вызовам и различиям над (coarray) изображениями.

  • Создание случайных, уникальных значений C #
  • Производить случайные числа равномерно по всему диапазону
  • Генерация случайных чисел в Objective-C
  • Генерировать N случайных и уникальных чисел в пределах диапазона
  • Как создать список номеров без дубликатов?
  • Почему я получаю одну и ту же последовательность для каждого запуска с помощью std :: random_device с mingw gcc4.8.1?
  • Самый эффективный способ случайного «сортировки» (Shuffle) списка целых чисел в C #
  • objective C: Modulo bias
  • Последовательно создайте один и тот же случайный массив numpy
  • Как лаконично, переносимо и основательно семя mn19937 PRNG?
  • Entity Framework Include OrderBy random генерирует повторяющиеся данные
  • Давайте будем гением компьютера.