Scroll to navigation

RANDOM(3) Руководство программиста Linux RANDOM(3)

ИМЯ

random, srandom, initstate, setstate - генератор случайных чисел

СИНТАКСИС

#include <stdlib.h>
long random(void);
void srandom(unsigned seed);
char *initstate(unsigned seed, char *state, size_t n);
char *setstate(char *state);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

random(), srandom(), initstate(), setstate():

_XOPEN_SOURCE >= 500
|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE
|| /* в версиях glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

ОПИСАНИЕ

The random() function uses a nonlinear additive feedback random number generator employing a default table of size 31 long integers to return successive pseudo-random numbers in the range from 0 to 2^31 - 1. The period of this random number generator is very large, approximately 16 * ((2^31) - 1).

Функция srandom() устанавливает свой аргумент в качестве семени для новой последовательности псевдослучайных чисел, которые будут возвращаться функцией random(). Эти последовательности повторяются, если вызывать srandom() с тем же значением семени. Если значение семени не указано, то функция random() автоматически устанавливает его равным 1.

Функция initstate() позволяет инициализировать массив состояния state для использования в функции random(). Размер массива состояния n используется initstate() для определения, какой сложности генератор случайных чисел необходимо использовать — чем больше массив, тем полученные числа будут более случайными. Текущие «оптимальные» значения размера массива состояния n: 8, 32, 64, 128 и 256 байт; другие значения будут округлены до ближайшей нижней границы. Если значения меньше 8 байт, то возвращается ошибка. Значение seed — это семя последовательности для инициализации, которое определяет стартовую точку последовательности псевдослучайных чисел и позволяет перезапустить последовательность с той же точки.

Функция setstate() изменяет состояние массива состояния, используемого в random(). Массив состояния state используется для генерации случайных чисел до следующего вызова initstate() или setstate(). Значение state должно быть инициализировано с помощью функции initstate() или результатом предыдущего вызова setstate().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

The random() function returns a value between 0 and (2^31) - 1. The srandom() function returns no value.

Функция initstate() возвращает указатель на предыдущий массив состояния. При ошибке в errno записывается соответствующий код.

При успешном выполнении функция setstate() возвращает указатель на предыдущий массив состояния. При ошибке она возвращает NULL и в errno записывает соответствующий код.

ОШИБКИ

Аргумент state, указанный setstate(), равен NULL.
Функции initstate() передан массив состояния меньше 8 байт.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
random(), srandom(), initstate(), setstate() Безвредность в нитях MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008, 4.3BSD.

ЗАМЕЧАНИЯ

Функция 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.

СМ. ТАКЖЕ

getrandom(2), drand48(3), rand(3), random_r(3), srand(3)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан 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.

1 ноября 2020 г. GNU