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);
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().
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 |
Это
функции
являются
расширениями
glibc.
Интерфейс
initstate_r()
запутывает.
Он
появился
для того,
чтобы
сделать
тип
random_data
скрытым, но
реализация
требует от
пользователя
перед
вызовом,
или
инициализировать
поле
buf.state
значением NULL,
или
обнулить
всю
структуру.
drand48(3),
rand(3),
random(3)
Русский
перевод
этой
страницы
руководства
был сделан
aereiae <
[email protected]>, Azamat Hackimov
<
[email protected]>, Dmitriy S. Seregin <
[email protected]>,
Katrin Kutepova <
[email protected]>, Lockal
<
[email protected]>, Yuri Kozlov <
[email protected]>,
Баринов
Владимир и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]