【问题标题】:rand() function behaviorrand() 函数行为
【发布时间】:2019-04-28 18:12:08
【问题描述】:

我正在学习 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() % 50 给你一个 0 到 49 之间的数字,如果你想要一个 30 到 79 之间的数字,你会怎么做?
  • 减法告诉你在 0.. 范围内需要多少个数字,当你将随机数添加到 MIN 然后 voilà 你有一个想要的数字范围。
  • rand ()% (MAX - MIN + 1) 提供什么,你需要做什么才能获得包含[MIN...MAX] 范围内的数字?
  • 附带说明,Stack Overflow 是一个英文网站。翻译代码中的变量名称和字符串将不胜感激。
  • @JL2210 :我认为我们可以做到。要求重写有问题的代码有点不合理,并且可能会引入与原始代码无关或与问题无关的错误。我宁愿发布的代码是问题所指的确切代码。在这种情况下,有问题的代码部分是在任何情况下都是英文的。

标签: c random


【解决方案1】:

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

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

在您的示例中,(MAX - MIN + 1) 是要生成的整数值的 span,而 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包含。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2012-11-08
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2021-02-14
    相关资源
    最近更新 更多