rand - генератор псевдослучайных чисел
rand(3)
генератор псевдослучайных чисел
Other Alias
rand_r, srand
ОБЗОР
#include <stdlib.h>
int rand(void);
int rand_r(unsigned int *seedp);
void srand(unsigned int seed);
Требования макроса тестирования свойств для glibc
(см. feature_test_macros(7)):
rand_r(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
ОПИСАНИЕ
Функция
rand() возвращает псевдослучайное целое число в диапазоне от нуля
до
RAND_MAX включительно (т. е., из математического диапазона [0,
RAND_MAX]).
Функция srand() устанавливает свой аргумент как основу (seed) для новой
последовательности псевдослучайных целых чисел, возвращаемых функцией
rand(). Эту последовательность можно воспроизвести. Для этого необходимо
вызвать srand() с той же величиной основы.
Если основа не задана, то функция rand() автоматически устанавливает её
равной 1.
Функция rand() не реентерабельная, так как она использует скрытое
состояние, которое изменяется с каждым вызовом. Это может быть как просто
значение основы, так и что-то более сложное. Чтобы получить воспроизводимое
поведение в многонитевом приложении такое состояние нужно создать явным
образом; это можно сделать с помощью реентерабельной функции rand_r().
Как и rand(), rand_r() возвращает псевдослучайное целое число из
диапазона [0, RAND_MAX]. Аргумент seedp является указателем на число
unsigned int, которое используется для хранения состояния между
вызовами. Если rand_r() вызывается с одинаковым начальным значением
целого, на которое указывает seedp, и это значение не изменяется между
вызовами, то результатом будет одинаковая псевдослучайная
последовательность.
Значение, на которое указывает аргумент seedp для rand_r(),
предоставляет только очень малую часть состояния, поэтому данная функция
будет очень не случайным псевдослучайным генератором. Используйте вместо неё
drand48_r(3).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции
rand() и
rand_r() возвращают значение в промежутке от 0 до
RAND_MAX (включительно). Функция
srand() не возвращает результат.
АТРИБУТЫ
Описание терминов данного раздела смотрите в
attributes(7).
Интерфейс Атрибут Значение
rand(),
rand_r(),
srand()
безвредность в потоках: безвредно (MT-Safe)
СООТВЕТСТВИЕ СТАНДАРТАМ
Функции
rand() и
srand() описаны в SVr4, 4.3BSD, C89, C99,
POSIX.1-2001. Функция
rand_r() описана в POSIX.1-2001. В POSIX.1-2008
функция
rand_r() помечена как устаревшая.
ЗАМЕЧАНИЯ
Версия функций
rand() и
srand() в библиотеке Си для Linux использует
тот же генератор чисел, что и в функциях
random(3) и
srandom(3), так
что младшие биты в числе случайны настолько, насколько и старшие. В то же
время, в старых реализациях
rand() и в текущих реализациях на других
системах младшие биты являются гораздо менее случайными, чем старшие. Не
используйте эту функцию в переносимых приложениях, для которых требуется
большая случайность (вместо неё используйте
random(3)).
ПРИМЕР
В POSIX.1-2001 приведён следующий пример реализации
rand() и
srand(),
возможно полезный, если требуется одинаковая последовательность на двух
разных машинах.
static unsigned long next = 1;
/* предполагается, что RAND_MAX равно 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned int seed) {
next = seed;
}
Следующая программа может использоваться для отображения псевдослучайной
последовательности, созданной rand() при указании определённой основы.
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
int j, r, nloops;
unsigned int seed;
if (argc != 3) {
fprintf(stderr, "Использование: %s <seed> <nloops>\n", argv[0]);
exit(EXIT_FAILURE);
}
seed = atoi(argv[1]);
nloops = atoi(argv[2]);
srand(seed);
for (j = 0; j < nloops; j++) {
r = rand();
printf("%d\n", r);
}
exit(EXIT_SUCCESS);
}