random_r(3)

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

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

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

int random_r(struct random_data *restrict buf,
             int32_t *restrict result);
int srandom_r(unsigned int seed, struct random_data *buf);

int initstate_r(unsigned int seed,
             char statebuf[restrict .statelen], size_t statelen,
             struct random_data *restrict buf);
int setstate_r(char *restrict statebuf,
             struct random_data *restrict 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(), а не связывает семя с глобальной переменной состояния.

The initstate_r() function is like initstate(3), except that it initializes the state in the object pointed to by buf, rather than initializing the global state variable. Before calling this function, the buf.state field must be initialized to NULL. The initstate_r() function records a pointer to the statebuf argument inside the structure pointed to by buf. Thus, statebuf should not be deallocated so long as buf is still in use. (So, statebuf should typically be allocated as a static variable, or allocated on the heap using malloc(3) or similar.)

The setstate_r() function is like setstate(3), except that it modifies the state in the object pointed to by buf, rather than modifying the global state variable. state must first have been initialized using initstate_r() or be the result of a previous call of setstate_r().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
All of these functions return 0 on success. On error, -1 is returned, with errno set to indicate the error.

ОШИБКИ

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

СТАНДАРТЫ
GNU.

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

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

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) aereiae <aereiae@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Lockal <lockalsash@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Баринов Владимир и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).