c++ - 为什么 stdlib 中的 rand 不遵循大数定律?

标签 c++ random std average

在下面的代码中,我期望骰子作用数十亿次,平均结果恰好是 3.5,高于 3.5 的百分比有时大约是 5%,而其他时候(当然有不同的种子)是像 95。但即使你达到 6040M thows,你也永远不会超过 50%,低于 3.5 的 50%?显然 rand() 有点偏差......

我知道“真正随机”不存在这一事实,但它真的这么明显吗?

典型的输出是:

Average: 3.50003 counter: 3427000000 Percentage above: 83.2554 Perc abs above counter: 50.0011
Average: 3.49999 counter: 1093000000 Percentage above: 92.6983 Perc abs above counter: 50.0003

#include <stdio.h>      /* printf, scanf, puts, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */
#include <unistd.h>
#include <iostream>
using namespace std;

int main ()
{
  long long int this_nr;
  long long int counter = 0;
  long long int above_counter = 0;
  long long int below_counter = 0;
  long long int above_counter_this = 0;
  long long int below_counter_this = 0;

  long long int interval_counter = 0;

  double avg = 0.0;
  srand (time(NULL));
  srand (time(NULL));
  srand (time(NULL));
  cout.precision(6);

  while(1) {
      this_nr = rand() % 6 + 1; // 0,1,2,3,4,5 or 6
      avg = ((double) this_nr + ((double)counter * (double) avg))
          / ((double) counter+1.0);
      if (this_nr <= 3) below_counter_this++;
      if (this_nr >= 4) above_counter_this++;
      if (avg < 3.5) below_counter++;
      if (avg > 3.5) above_counter++;
      if (interval_counter >= 1000000) {
        cout << "Average: " << avg << " counter: " << counter << " Percentage above: "
                 << (double) above_counter / (double) counter * 100.0
                 << " Perc abs above counter: " << 100.0 * above_counter_this / counter
                 << "                 \r";
        interval_counter = 0;
      }
      //usleep(1);
      counter++; 
      interval_counter++;
  }
}

最佳答案

众所周知,

rand() 是一个糟糕的生成器,它在低位方面尤其糟糕。执行 % 6 仅选择低位。您也有可能遇到一些 modulo bias ,但我预计这种影响相对较小。

关于c++ - 为什么 stdlib 中的 rand 不遵循大数定律?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29542140/

相关文章:

c++ - 在 C++ 中,如果我有一个 vector 类型的 vector ,如果我在 : vector_variable. push_back() 之后执行此操作会发生什么?

c++ - 每个实例不同的模板类的静态 constexpr 成员?

java - 如何找到复数数组 a + ci 中的最小值

java - 如何在下午 4 点和凌晨 2 点之间的两个时间生成随机时间?

java - 如何将随机数转换为字符

c++ - uintptr_t 和 size_t 相同吗?

c++ - 在不同 DLL 之间传递的标准对象

c++ - 杀死和使用 waitpid 进行收获的能力之间的预期持续时间

c++ - 重写运算符多个参数

c++ - 可变参数构造函数优先于用户提供的 move 构造函数,默认情况下除外