rand()函数行为

问题描述 投票:-3回答:1

我正在学习C中的rand()函数,因为我想用它来生成一个范围内的随机数。但是,我对下面的算法的一部分有疑问。

#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;

如果我离开它,结果会是什么?

c random
1个回答
2
投票

rand()是介于0和RAND_MAX之间的数字。

rand() % n是一个介于0和n - 1之间的数字。如果你想要一个从0到n的值,那么你需要rand() % (n+1)

在您的示例中,(MAX - MIN + 1)是要生成的整数值的范围,而MIN是较低的值。例如,在哪里:

MIN = -10
MAX = 10

跨度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(包括0和n)。

© www.soinside.com 2019 - 2024. All rights reserved.