random_r(3)

реентерабельный генератор случайных чисел · man3 · Русский

random_r(3) Library Functions Manual random_r(3)

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

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)EN. Они подходят для использования в многонитевых программах, где каждой нити необходимо получить независимую, воспроизводимую последовательность случайных чисел.

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

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

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

Функция setstate_r() подобна setstate(3)EN, но изменяет состояние в объекте, на который указывает 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.

Функции initstate_r() передан массив состояния меньше 8 байт.
Аргумент statebuf или buf функции setstate_r() равнялся NULL.
Аргумент 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)EN, rand(3)EN, random(3)EN

Русский перевод этой страницы руководства был сделан 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 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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

5 февраля 2023 г. Linux man-pages 6.03