我想使用 POSIX 上的线程生成数百万个 0 到 1 之间的随机数(包括 0 和 1)。我尝试了两个代码,但它仍然给我错误的结果,它生成大的有符号数字。
代码(1):
srand(time(NULL));
for (i = 0; i < 10; i++)
{
double r = (double)(rand()%1001)/1000;
printf("Random double, 0 to 1: %f\n",r);
}
代码(2):
srand(time(NULL));
for (i = 0; i < 10; i++)
{
double r = rand()/(double)RAND_MAX;
printf("Random double, 0 to 1: %f\n",r);
}
生成的结果如下:
12451421454
-4514251445
96541213212
-56543214521
那么解决方案是什么,,,,请
最佳答案
对! pi 的计算值不精确。
如果你有 30 分钟的时间,请看这个 video关于随机数的生成。或者这个问题C++ random float number generation .
x=(double)(rand()%1001)/1000;
不是生成 0 到 1 之间的随机数的正确方法...自 RAND_MAX%1001!=0
以来,只有 1000 个可能的值,并且有些值比其他值更有可能! x = rand()/(double)RAND_MAX;
效果更好。
此外,请记住中心极限定理:错误类似于 1/sqrt(total)
: 你永远不会得到 10 位数字。尝试增加total
.
和sqrt(x*x+y*y)<1
成本高昂:(x*x+y*y)<1
就足够了。
最后,尝试 random C++11 的。
srand(time(NULL));
如果您计划使用许多线程,可能会造成麻烦:time(NULL)
每秒只改变一次,并且许多线程将获得相同的值。将种子发送到线程或使用 random_device为您的随机生成器播种。
关于c - 如何使用 POSIX 上的线程生成 [0,1] 之间的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26448760/