繁体   English   中英

rand() 函数行为

[英]rand() function behavior

我正在学习 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;

如果我离开它,结果会怎样?

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 inclusive

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM