Provided by: manpages-ru-dev_4.17.0-2_all
ИМЯ
rand, rand_r, srand - генератор псевдослучайных чисел
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#include <stdlib.h> int rand(void); int rand_r(unsigned int *seedp); void srand(unsigned int seed); Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)): rand_r(): Since glibc 2.24: _POSIX_C_SOURCE >= 199506L Glibc 2.23 and earlier _POSIX_C_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 <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int r; unsigned int seed, nloops; 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 (unsigned int j = 0; j < nloops; j++) { r = rand(); printf("%d\n", r); } exit(EXIT_SUCCESS); }
СМ. ТАКЖЕ
drand48(3), random(3)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан 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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.