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

标签 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

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

最佳答案

对! 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/

相关文章:

c++ - 为什么 omp_set_num_threads( omp_get_num_threads() ) 会改变任何东西?

python - 如何将列表中的随机值分配给同一行的另一列中不存在的新列?

javascript - 如果他们得到某个字符串,我该如何重定向用户

c++ - 你如何为堆中的 char[] 赋值?

c - 如何将一个字节分成 4 对 2 位

c - 段错误(核心转储)

python - 最多等待 N 秒,让 fork 的子 PID 完成

c - 轮盘赌选择的实现

java - Android .aidl 中的单向声明是否保证该方法将在单独的线程中调用?

python - 以概率向数组添加元素