我想使用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
那是什么解决方案,,,,
答案 0 :(得分:2)
对! 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
就足够了。
最后,试试C ++ 11的random。
如果您计划使用多个线程, srand(time(NULL));
可能会导致问题:time(NULL)
仅在一秒钟内更改一次,并且许多线程将获得相同的值。将种子发送到线程或使用random_device为随机生成器播种。