c - rand() 函数行为

标签 c random

我正在学习 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 (含).

关于c - rand() 函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55893188/

相关文章:

c++ - 如何访问计算机的 RAM 和 ROM 的所有字节?

java - 生成随机 float ,包括两个边界

c++ - 有概率的程序

c - read() 似乎进入无限循环

random - 我们需要一个随机数生成器来解密(解密)吗?

java - 改进数独的随机数生成器

c - C中的随机迷宫生成器

c - 使用常量定义的位数

c - Delphi 中 C 语言中 ' unsigned char** ' 的等价物是什么

c++ - libssh:简单实现中丢失的内存