поведение функции rand () - PullRequest
0 голосов
/ 28 апреля 2019

Я изучаю функцию rand() в C, так как хочу использовать ее для генерации случайного числа в диапазоне. Тем не менее, у меня есть вопрос о части алгоритма ниже.

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

int main()
{
    const MAX = 20, MIN = 1;
    srand(time(NULL));
    int randNumber = rand() % (MAX - MIN + 1) + MIN;
    printf("%d", randNumber);
    // yeu cau nhap so
    int duDoan;
    printf("Moi ban du doan con so:");
    scanf("%d", &duDoan);
    // chay vong lap kiem tra
    while(duDoan != randNumber) {
        printf("Ban da sai. Moi nhap lai:");
        scanf("%d", &duDoan);
    }
    printf("Ban da nhap dung. Dap an la: %d ", randNumber);

    return 0;
}

Что меня смущает, так это то, почему мы должны добавить + MIN в эту строку:

rand() % (MAX - MIN + 1) + MIN;

Если я оставлю это, каков будет результат?

1 Ответ

2 голосов
/ 28 апреля 2019

rand() - это число от 0 до RAND_MAX.

rand() % n - это число от 0 до n - 1. Если вы хотите значение от 0 до n, вам нужно rand() % (n+1).

В вашем примере (MAX - MIN + 1) - это span целочисленных значений для генерации, тогда как MIN - это нижнее значение. Так, например, где:

MIN = -10
MAX = 10

span n:

n = (MAX - MIN + 1) = 21

так что:

rand() % n

дает значения от 0 до 20 и

rand() % n - MIN

- от -10 до +10. Без +1 было бы неправильно от -10 до + 9.

Обратите внимание, что если требуется статистически высокое качество случайного числа, ограничение диапазона с использованием % является ошибочным и приведет к смещению, когда n не является фактором RAND_MAX + 1. В этом случае (int)(n * ((double)rand() / (double)RAND_MAX)) является лучшим решением, поэтому вы должны иметь:

int randNumber = (int)((MAX - MIN) * ((double)rand() /
                                      (double)RAND_MAX)) + MIN ;

Обратите внимание, что здесь нет +1, потому что диапазон (double)rand() / (double)RAND_MAX составляет от 0 до 1, поэтому умножение на n дает от 0 до n включительно .

...