initstate - генератор случайных чисел
initstate(3)
генератор случайных чисел
Other Alias
random, srandom, setstate
ОБЗОР
#include <stdlib.h>
long int random(void);
void srandom(unsigned int seed);
char *initstate(unsigned int seed, char *state, size_t n);
char *setstate(char *state);
Требования макроса тестирования свойств для glibc
(см. feature_test_macros(7)):
random(), srandom(), initstate(), setstate():
_SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
ОПИСАНИЕ
Функция
random() использует нелинейный возвратно-аддитивный генератор
случайных чисел, используя по умолчанию таблицу из 31-ого длинного целого
числа и возвращает очередное псевдослучайное число в промежутке от 0 до
RAND_MAX. Период этого генератора очень велик, приблизительно
16 * ((2^31) - 1).
Функция srandom() устанавливает свой аргумент в качестве семени для новой
последовательности псевдослучайных чисел, которые будут возвращаться
функцией random(). Эти последовательности повторяются, если вызывать
srandom() с тем же значением семени. Если значение семени не указано, то
функция random() автоматически устанавливает его равным 1.
Функция initstate() позволяет инициализировать массив состояния state
для использования в функции random(). Размер массива состояния n
используется initstate() для определения, какой сложности генератор
случайных чисел необходимо использовать. Чем больше массив, тем полученные
числа будут более случайными. seed — это семя последовательности для
инициализации, которое определяет стартовую точку последовательности
псевдослучайных чисел и позволяет перезапустить последовательность с той же
точки.
Функция setstate() изменяет состояние массива состояния, используемого в
random(). Массив состояния state используется для генерации случайных
чисел до следующего вызова initstate() или setstate(). Значение
state должно быть инициализировано с помощью функции initstate() или
результатом предыдущего вызова setstate().
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция
random() возвращает значение в промежутке от 0 до
RAND_MAX. Функция
srandom() не возвращает значение.
Функция initstate() возвращает указатель на предыдущий массив
состояния. При ошибке в errno записывается соответствующий код.
При успешном выполнении функция setstate() возвращает указатель на
предыдущий массив состояния. При ошибке она возвращает NULL и в errno
записывает соответствующий код.
ОШИБКИ
EINVAL
Аргумент state, указанный setstate(), равен NULL.
EINVAL
Функции initstate() передан массив состояния меньше 8 байт.
АТРИБУТЫ
Описание терминов данного раздела смотрите в
attributes(7).
Интерфейс Атрибут Значение
random(),
srandom(),
initstate(),
setstate()
безвредность в потоках: безвредно (MT-Safe)
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, 4.3BSD.
ЗАМЕЧАНИЯ
В настоящее время «оптимальными» размерами массива состояния
n считаются
8, 32, 64, 128 и 256 байтов; все остальные значения будут округляться до
ближайшего известного меньшего количества. Использование размера менее 8
байтов приводит к ошибке.
Эта функция не должна использоваться, если random() используется в
нескольких нитях и её поведение должно быть повторимо. Для этих целей
используйте random_r(3).
Генерация случайных чисел является сложной проблемой. В главе 7 (Random
Numbers) Numerical Recipes in C: The Art of Scientific Computing (William
H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New
York: Cambridge University Press, 2007, 3rd ed.) приведено великолепное
обсуждение проблем практического применения генерации случайных чисел.
Также вы можете обратиться к теоретическому обсуждению, которое также
объясняет многие практические проблемы, приведенному в главе 3 (Random
Numbers) второго тома Искусства программирования Дональда Кнута (The Art
of Computer Programming, volume 2 (Seminumerical Algorithms), 2nd ed.;
Reading, Massachusetts: Addison-Wesley Publishing Company, 1981).
ДЕФЕКТЫ
Согласно POSIX,
initstate() должна возвращать NULL при ошибке. Реализация
glibc в
errno записывает код ошибки (как по стандарту), но не возвращает
NULL.