Provided by: manpages-ru-dev_4.17.0-2_all bug

ИМЯ

       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⟩.