如何使用POSIX上的线程生成[0,1]之间的随机数

时间:2014-10-19 08:31:02

标签: c multithreading random posix

我想使用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

那是什么解决方案,,,,

1 个答案:

答案 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为随机生成器播种。