RANDOM_R(3)

ИМЯ
random_r, srandom_r, initstate_r, setstate_r - реентерабельный генератор случайных чисел

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

int random_r(struct random_data *buf, int32_t *result);

int srandom_r(unsigned int seed, struct random_data *buf);

int initstate_r(unsigned int seed, char *statebuf,
                size_t statelen, struct random_data *buf);

int setstate_r(char *statebuf, struct random_data *buf);

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

random_r(), srandom_r(), initstate_r(), setstate_r():
    /* в glibc начиная с 2.19: */ _DEFAULT_SOURCE
        || /* версии glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

ОПИСАНИЕ
Эти функции являются реентрабельными эквивалентами функций, которые описаны в random(3). Они подходят для использования в многонитевых программах, где каждой нити необходимо получить независимую, воспроизводимую последовательность случайных чисел.

Функция random_r() подобна random(3), но вместо использования информации о состоянии, хранящейся в глобальный переменной, в ней используется информация о состоянии в аргументе, указанном в buf, который должен быть проинициализирован ранее с помощью initstate_r(). Сгенерированное случайное число возвращается в аргументе result.

Функция srandom_r() подобна srandom(3), но инициализирует семя для генератора случайных чисел, чьё состояние хранится в объекте, на который указывает buf который должен быть проинициализирован ранее с помощью initstate_r(), а не связывает семя с глобальной переменной состояния.

Функция initstate_r() подобна initstate(3), но инициализирует состояние в объекте, на который указывает buf, а не в глобальной переменной состояния. Перед вызовом этой функции в поле buf.state нужно записать NULL. Функция initstate_r() сохраняет указатель на аргумент statebuf внутри структуры, указанной в buf. Таким образом, statebuf не должна освобождаться пока используется buf (и statebuf обычно должна быть статической переменной или выделяться из кучи с помощью malloc(3) и подобных ей).

Функция setstate_r() подобна setstate(3), но изменяет состояние в объекте, на который указывает buf, а не в глобальной переменной состояния. Переменная state сначала должна инициализироваться с помощью initstate_r() или быть результатом предшествующего вызова setstate_r().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении все функции возвращают 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EINVAL
    Функции initstate_r() передан массив состояния меньше 8 байт.

EINVAL
    Аргумент statebuf или buf функции setstate_r() равнялся NULL.

EINVAL
    Аргумент buf или result функции random_r() равнялся NULL.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
random_r(), srandom_r(), initstate_r(), setstate_r() | Безвредность в нитях | MT-Safe race:buf

СООТВЕТСТВИЕ СТАНДАРТАМ
Это функции являются расширениями glibc.

ДЕФЕКТЫ
Интерфейс initstate_r() запутывает. Он появился для того, чтобы сделать тип random_data скрытым, но реализация требует от пользователя перед вызовом, или инициализировать поле buf.state значением NULL, или обнулить всю структуру.

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