DRAND48(3)

ИМЯ
drand48, erand48, lrand48, nrand48, mrand48, jrand48, srand48, seed48, lcong48 - генерация равномерно распределённых псевдослучайных чисел

ОБЗОР
#include <stdlib.h>

double drand48(void);

double erand48(unsigned short xsubi[3]);

long int lrand48(void);

long int nrand48(unsigned short xsubi[3]);

long int mrand48(void);

long int jrand48(unsigned short xsubi[3]);

void srand48(long int seedval);

unsigned short *seed48(unsigned short seed16v[3]);

void lcong48(unsigned short param[7]);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

Для всех вышеуказанных функций: _XOPEN_SOURCE
    || /* начиная с glibc 2.19: */ _DEFAULT_SOURCE
    || /* в версии Glibc <= 2.19: */ _SVID_SOURCE

ОПИСАНИЕ
Данные функции генерируют псевдослучайные числа при помощи линейного конгруэнтного метода и арифметики на основе 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(). Функциям erand48(), nrand48() и jrand48() для первого вызова инициализаторы не требуются.

Все функции работают за счёт генерации последовательности 48-битных целых чисел Xi согласно формуле линейного конгруэнтного метода:

    Xn+1 = (aXn + c) mod m, где n >= 0

Параметр m = 2^48, поэтому в вычислениях используются 48-битные целые числа. Если lcong48() не вызывалась, то a и c принимают следующие значения:

    a = 0x5DEECE66D
    c = 0xB

Для получения значения, возвращаемого любой из функций (drand48(), erand48(), lrand48(), nrand48(), mrand48() или jrand48()), сначала генерируется следующее 48-битное Xi в последовательности. Затем подходящее число бит (согласно типу возвращаемых данных) копируется в верхние биты Xi и трансформируется во возвращаемое значение.

Функции drand48(), lrand48() и mrand48() сохраняют последнее сгенерированное 48-битное значение Xi во внутреннем буфере. Для функций erand48(), nrand48() и jrand48() требуется, чтобы вызывающая программа создавала хранилище для последующих значений Xi и указывала его в аргументе-массиве xsubi. Функции инициализируются путём помещения начального значения Xi в массив до их первого вызова.

Функция инициализации srand48() устанавливает верхние 32 бита Xi в аргументе seedval. Нижние 16 бит устанавливаются в обязательное значение 0x330E.

Функция инициализации seed48() устанавливает Xi в 48-битное значение, указанное в аргументе-массиве seed16v. Предыдущее значение Xi копируется во внутренний буфер, указатель на который возвращается seed48().

Функция инициализации lcong48() позволяет пользователю указывать первоначальные значения для Xi, a и c. Для Xi используется аргумент массива param[0-2], для a — param[3-5], а для c — param[6]. После вызова lcong48() следующий вызов srand48() или seed48() восстановит стандартные значения a и c.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
drand48(), erand48(), lrand48(), nrand48(), mrand48(), jrand48(), srand48(), seed48(), lcong48() | Безвредность в нитях | MT-Unsafe race:drand48

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

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4.

СМОТРИТЕ ТАКЖЕ
rand(3), random(3)