为什么随机数和正确的猜测之间存在很强的相关性?

时间:2016-05-09 15:27:08

标签: c# random

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

该测试应该模拟翻转硬币(头部= 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亿次调用对此进行了测试 - 但我没想到生成数字的总和与数字相关正确的猜测。

2 个答案:

答案 0 :(得分:4)

您的错误就在这一行:

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

通过尝试将总和(基于i到该点)除以是没有意义的。除以i(编辑:更确切地说是i + 1)而不是avg给你一些有意义的东西。

答案 1 :(得分:-3)

没有种子的Random类使用当前时间作为种子生成一个随机数,这意味着在你的循环中调用rnd.Next方法将导致相同的数字多次,这取决于你的速度有多快机器经历了这个循环。