|
D_RANDOM Библиотека "JINRLIB" 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.
Пpимеp:
-------
. . .
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
|