在尝试测试知道随机数的历史记录是否可以帮助预测将来的结果时,我发现生成的平均值与正确猜测的数量之间存在强烈的,意料之外的关联。

该测试应该模拟硬币翻转(正面= 0,正面= 1),如果先前的尝试偏向正面,则猜测正面,反之亦然。

为什么在下面的LinqPad程序中生成的数字总和总是几乎等于正确的猜测数字?

void Main()
{
  var rnd = new Random();
  var attempts = 10000000;
  var correctGuesses = 0;
  long sum = 0;
  decimal avg = 0.5m;

  for (int i = 0; i < attempts; i++)
  {
    var guess = avg < 0.5m ? 1 : 0;
    var result = rnd.Next(0, 2);
    if (guess == result)
    {
      correctGuesses += 1;
    }
    sum += result;
    avg = (decimal)sum/(decimal)attempts;
  }

  attempts.Dump("Attempts");
  correctGuesses.Dump("Correct Guesses");

  avg = (decimal)sum / (decimal)attempts;
  avg.Dump("Random Number Average");
}


代码出错了吗?这是自然的关系吗?我希望随着尝试次数的增加,平均值会收敛于0.5,因为分布相当均匀-我通过对Random.Next(0,2)的100亿次调用测试了这一点-但我并不希望生成的总数与正确的数目相关猜。

最佳答案

您的错误是此行:

avg = (decimal)sum/(decimal)attempts;


用尝试将总和(基于到该点的i)除以没有意义。除以i(编辑:更准确地说是i + 1),而不是让平均值给您一些有意义的信息。

10-05 19:22