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