Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

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

LIBRARY

       Standard C library (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(),  а  не  связывает  семя  с  глобальной
       переменной состояния.

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

       Функция setstate_r() подобна setstate(3), но изменяет  состояние  в  объекте,  на  который
       указывает  buf,  а  не  в глобальной переменной состояния. Переменная state сначала должна
       инициализироваться с помощью initstate_r() или  быть  результатом  предшествующего  вызова
       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(),        │ Безвредность в нитях │ MT-Safe race:buf │
       │setstate_r()                                   │                      │                  │
       └───────────────────────────────────────────────┴──────────────────────┴──────────────────┘

СТАНДАРТЫ

       Это функции являются расширениями glibc.

ДЕФЕКТЫ

       Интерфейс  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 версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.