ОБЪЕДИНЕННЫЙ   ИНСТИТУТ   ЯДЕРНЫХ   ИССЛЕДОВАНИЙ
lit
  Библиотека   программ   JINRLIB eng

D_RANDOM - семейство генераторов случайных чисел

V107

Автор: А.П.Сапожников Язык: Фортран

Программа выдает псевдослучайные числа, равномерно распределенные на интервале (0,1), не включая конечные точки.
Предлагается 2 различных генератора последовательности случайных чисел.
Выбор генератора задается при обращении к функции.

Структура:

Тип: - FUNCTION
Имена входа для пользователя: - D_RANDOM, RANDOMINITIATE

Обращение:

X=D_Random(N), где:

N - 1,2 - номер генератора (INTEGER);
X - (REAL*8) случайное число в диапазоне (0,1);

RandomInitiate(i,k) - инициализация генератора целыми числами i,k.


N=1

Этот генератор случайных чисел впервые опубликован в статье:

G.Marsaglia and A. Zaman,
Toward a Universal Random Number Generator,
Florida State University Report: FSU-SCRI-87-50 (1987).

Он имеет период 2^144. Полностью переносим (дает идентичную последовательность результатов на всех машинах с мантиссой не менее 48 бит в представлении с плавающей точкой).

Для получения одного случайного числа выполняется 5 операций сложения с плавающей запятой и 3 операции сложения с целыми числами.


Подпрограмма RandomInitiate(i,k) инициализирует генератор двумя целыми числами i и k
( 0 <= i <= 31328, 0 <= k <= 30081).
Это позволяет получить около 900000000 различных серий случайных чисел.
Инициализация по умолчанию: i=1802, k=9373.
RandomInitiate определяет только серию, числа серии начинаются с начала.
Полное состояние этого генератора содержится в COMMON-блоке:
COMMON /RanGen_Parameters/ istat(4),rstat(100)
real*8 rstat

D_Random(-999) выводит istat(1) и istat(2), соответствующие значениям i и k текущей серии.


N = 2

Переносимый генератор случайных чисел, описанный в статье:

P.L'Ecuyer, Efficient and Portable Random Number Generators,
Comm. ACM 31:743 (1988) 742.

Подпрограмма RandomInitiate(i,k) инициализирует генератор
двумя целыми числами i > 0 и k > 0.
Инициализация по умолчанию: i=1802, k=9373.
Эти два числа полностью определяют состояние генератора.
D_Random(-999) выдает значения i и k.


Пример:
      . . .
      implicit real*8 (a-h,o-z)
      . . .
      do i=1,5
        write(*,'(2f18.14)') D_Random(1),D_Random(2)
      enddo
      . . .
Результат:
     .47444060942140   .85597053361232
     .80073601515072   .38790535493994
     .51635387886227   .14669151631475
     .30258604127470   .19100434993394
     .01901665275539   .71819570289829


home up e-mail