Scroll to navigation

rand(3) Library Functions Manual rand(3)

ИМЯ

rand, rand_r, srand - генератор псевдослучайных чисел

БИБЛИОТЕКА

Стандартная библиотека языка C (libc, -lc)

СИНТАКСИС

#include <stdlib.h>
int rand(void);
void srand(unsigned int seed);
[[deprecated]] int rand_r(unsigned int *seedp);

Требования макроса тестирования свойств для 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

СТАНДАРТЫ

The functions rand() and srand() conform to SVr4, 4.3BSD, C99, POSIX.1-2001. The function rand_r() is from POSIX.1-2001. POSIX.1-2008 marks rand_r() as obsolete.

ПРИМЕЧАНИЯ

Версия функций 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; }

The following program can be used to display the pseudo-random sequence produced by rand() when given a particular seed. When the seed is -1, the program uses a random seed.


#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]);
if (seed == -1) {
seed = arc4random();
printf("seed: %u\n", seed);
}
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 (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.

5 февраля 2023 г. Справочные страницы Linux 6.03