【发布时间】:2019-01-07 12:32:31
【问题描述】:
这是我为生成随机双精度所做的:
int main()
{
srand(time(NULL));
double max = 10.0;
double x = (double)rand()/(double)(RAND_MAX/max);
printf("The random number is %f \n", x);
}
虽然这个生成的数字本质上是随机的,但它仍然不够随机。
我第一次运行这个,我得到了 7.303385 然后我得到了 7.320475。 然后我得到了 7.332377。 然后我得到了 7.345195。
你明白了。看起来我的代码只生成 7.3 和 7.4 之间的随机数。
我在这里做错了什么?
编辑:
我刚刚注意到的另一件奇怪的事情:
我稍微修改了代码:
int main()
{
srand(time(NULL));
double max = 10.0;
double x = (double)rand()/(double)(RAND_MAX/max);
double y = (double)rand()/(double)(RAND_MAX/max);
printf("The random number is %f \n", x);
printf("The random number is %f \n", y);
}
当我运行它时,x 总是给我一个介于 7.3 和 7.4 之间的值,所以这里没有变化。但是, y 总是在 0 到 10 之间生成,这正是我想要的。那么为什么 x 表现不同呢?
【问题讨论】:
-
如果您删除
srand(time(NULL));会发生什么? -
互联网上有 许多 教程,这里有很多关于获取某个范围内的数字的问题(例如
0到10)。请先搜索一下。 -
顺便说一句,您是在循环中执行所有这些操作吗?包括
srand电话?请尝试创建minimal reproducible example 向我们展示。 -
确保您致电
srand()一次。我有一些用于统一生成随机数的代码here,但正如那个家伙所说,互联网上有很多。 -
在不相关的说明中,您不需要演员表。因为
max是double类型,所以RAND_MAX / max的结果也将是double。因此,第二个分区也将是double类型。所以只有rand() / (RAND_MAX / max)就够了。