Other Alias
random, initstate, 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).