Как вызвать PRNG, используя последовательные начальные значения? - PullRequest
0 голосов
/ 27 июня 2018

Ниже код был принят из prng , написанного на Фортране 77.

    double precision function usran(ir)
c
c   this subroutine generates random values between 0.0 and 1.0 using
c   an integer seed
c   it is based on the imsl routine ggubs.
c
c   double precision version
c
    implicit double precision (a-h,o-z)
    parameter(da=16807.d0,db=2147483647.d0,dc=2147483648.d0)
    ir=abs(mod(da*ir,db)+0.5d0)
    usran=dfloat(ir)/dc
    return
    end

Мне кажется, что ir - это начальный вход, который является переназначенным целым числом, в идеале он возвращает случайное число в диапазоне от 0 до 1, которое затем используется в качестве следующего начального значения. Но я не понимаю, как это работает?

Я имею в виду, если у меня есть начальное случайное значение в качестве моего seed, тогда input usran(seed) возвращает значение в (0,1), тогда как вызвать следующее значение в текущей последовательности?

Я не могу придумать более конкретное название для этой темы.

1 Ответ

0 голосов
/ 08 июля 2018

Я имею в виду, если у меня есть начальное случайное значение в качестве seed, то введите usran(seed) возвращает значение в (0,1), затем, как вызвать следующее значение в текущей последовательности?

Как прокомментировали @francescalus и @Vladmir F, эта функция имеет побочный эффект . Из Википедии:

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

В конкретном случае вашей функции, кроме возврата случайного числа, она изменяет значение своего аргумента с помощью ir=abs(mod(da*ir,db)+0.5d0). Поэтому каждый раз, когда вы вызываете его снова с той же переменной, что и аргумент, ir будет передаваться с другим значением и, таким образом, будет генерироваться другое случайное число.

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

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

...