Глиф Учебники

Случайные числа: rand и srand

Справочник · C · 2 минуты чтения

C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    int dice = rand() % 6 + 1;
    int x = rand() % 101;
    int y = rand() % (50 - 10 + 1) + 10;
    printf("Кубик: %d\n", dice);
    printf("От 0 до 100: %d\n", x);
    printf("От 10 до 50: %d\n", y);
    return 0;
}

Результат при каждом запуске свой, поэтому здесь он не показан.

Почему числа одинаковые при каждом запуске

Без srand генератор всегда начинает с одного и того же места (как после srand(1)), и программа при каждом запуске выдаёт ту же «случайную» последовательность. Добавьте srand(time(NULL)); в начало main.

Иногда повтор как раз полезен — при отладке. Тогда пишут srand(42); с постоянным числом: последовательность будет одинаковой при каждом запуске на этом компьютере, и ошибку легко воспроизвести.

Числа повторяются внутри программы

srand вызывают один раз, в начале программы. Если вызвать srand(time(NULL)) перед каждым rand() (например, в цикле или в своей функции «дай случайное число»), все вызовы за одну секунду получат одно и то же начальное значение — и одно и то же число.

C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int random_in(int a, int b) {
    return rand() % (b - a + 1) + a;
}

int main(void) {
    srand(time(NULL));
    for (int i = 0; i < 5; i++) {
        printf("%d ", random_in(1, 10));
    }
    printf("\n");
    return 0;
}

Здесь srand стоит в main один раз, а функция random_in только вызывает rand.

Случайное дробное число

rand() даёт только целые. Дробное от 0 до 1 получается делением на RAND_MAX:

C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    double r = (double)rand() / RAND_MAX;
    double t = 15.0 + r * (25.0 - 15.0);
    printf("От 0 до 1: %.3f\n", r);
    printf("Температура от 15 до 25: %.1f\n", t);
    return 0;
}

Приведение (double) обязательно: без него rand() / RAND_MAX — деление целых, и почти всегда получится 0.

Ограничения rand