DRAND48(3C)
НАЗВАНИЕ
drand48, erand48, lrand48, nrand48, mrand48, jrand48,
srand48, seed48, lcong48 - генерация равномерно распределенных псевдослучайных чисел
СИНТАКСИС
double drand48 ( )
double erand48 (xsubi)
unsigned short xsubi [3];
long lrand48 ( )
long nrand48 (xsubi)
unsigned short xsubi [3];
long mrand48 ( )
long jrand48 (xsubi)
unsigned short xsubi [3];
void srand48 (seedval)
long seedval;
unsigned short *seed48 (seed16v)
unsigned short seed16v [3];
void lcong48 (param)
unsigned short param [7];
ОПИСАНИЕ
Данное семейство функций порождает псевдослучайные числа с использованием широко известного линейного конгруэнтного алгоритма и 48-битной целой арифметики.
Функции drand48 и erand48 возвращают неотрицательные
вещественные числа двойной точности, равномерно распределенные в интервале [0.0, 1.0).
Функции lrand48 и nrand48 возвращают неотрицательные
целые числа типа long, равномерно распределенные в интервале [0, 2^31).
Функции mrand48 и jrand48 возвращают целые числа со
знаком, типа long, равномерно распределенные в интервале [-2^31, 2^31).
Функции srand48, seed48 и lcong48 представляют собой
инициализирующие точки входа, обращение к которым должно предшествовать вызову какой-либо из функций drand48,
lrand48, mrand48. (Хотя это и не рекомендуется, в том
случае, когда функции drand48, lrand48, mrand48 будут
вызваны без предварительного обращения к инициализирующим точкам входа, подстановка постоянных начальных значений, принимаемых по умолчанию, будет произведена автоматически.) Функции erand48, nrand48 и jrand48 не
требуют предварительного обращения к инициализирующим
точкам входа.
Все программы работают, порождая последовательность
48-битных целых значений X [i] в соответствии с линейной конгруэнтной формулой
X [n+1] = (a * X [n] + c) mod m n 0
Параметр m = 2^48 и поэтому используется 48-битная целая арифметика. Если не было предварительного обращения
к lcong48, для коэффициента a и аддитивной константы c
будут приняты следующие значения:
a = 0x5DEECE66D = 0273673163155
c = 0xB = 013
Первым этапом вычисления возвращаемого значения для любой из функций drand48, erand48, lrand48, nrand48,
mrand48 или jrand48 является генерация очередного 48
битного значения X[i]. Далее из него берутся старшие
биты в количестве, определяемом типом требуемого данного, которые и преобразуются в возвращаемое значение.
Функции drand48, lrand48 и mrand48 сохраняют последнее
сгенерированное 48-битное значение X[i] во внутреннем
буфере - вот почему они должны быть инициализированы
перед своим вызовом. Для функций же erand48, nrand48 и
jrand48 вызывающая программа должна сама резервировать
память под очередное значение X[i], передаваемое при
вызове как аргумент. Эти функции инициализации не требуют; вызывающая программа должна просто поместить желаемое начальное значение X[i] в массив из трех 16-битных слов и передать тот как аргумент. Посредством использования различных аргументов функции erand48,
nrand48 и jrand48 позволяют различным модулям большой
программы генерировать несколько независимых потоков
псевдослучайных чисел; другими словами, последовательность чисел в каждом потоке не зависит от того, как
часто программа вызывалась для генерации чисел других
потоков.
Инициализирующая функция srand48 устанавливает старшие
32 бита значения X[i] равными 32-м битам своего аргумента. Независимо от значения старших бит, младшие 16
бит X[i] устанавливаются равными 0x330E.
Инициализирующая функция seed48 устанавливает значение
всех 48 бит X[i] по значению аргумента - массива из
трех 16-битных слов. Предыдущее значение X[i] копируется в 48-битный внутренний буфер, используемый только
функцией seed48. Возвращаемое функцией seed48 значение
представляет собой указатель на этот буфер. Возвращаемый указатель в большинстве случаев игнорируется, однако он может оказаться полезным при перезапуске программы с данной точки в будущем. Для этого, используя указатель, следует извлечь и сохранить последнее значение
X[i], которое затем, при перезапуске, употребить для
повторной инициализации с помощью seed48.
Инициализирующая функция lcong48 дает пользователю возможность указать начальное значение X [i], значение коэффициента a и аддитивной константы c. В массиве, являющемся ее аргументом, элементы param [0-2] определяют X
[i], элементы param [3-5] - коэффициент a и, наконец,
param [6] - 16-битную константу c. После вызова lcong48
восстановить "стандартные" значения коэффициента a и
константы c, описанные выше, можно путем вызова какой
либо из функций srand48 или seed48.
ПРИМЕЧАНИЯ
Исходный текст данного семейства функций для мобильной
версии может быть использован даже на компьютерах, не
обладающих арифметикой вещественных чисел. В такой ситуации функций drand48 и erand48 не существует; их заменяют следующие две функции:
long irand48 (m)
unsigned short m;
long krand48 (xsubi, m)
unsigned short xsubi [3], m;
Функции irand48 и krand48 возвращают неотрицательные
целые числа типа long, равномерно распределенные в интервале [0, m-1].
СМ. ТАКЖЕ
rand(3C).