在尝试测试知道随机数的历史记录是否可以帮助预测将来的结果时,我发现生成的平均值与正确猜测的数量之间存在强烈的,意料之外的关联。
该测试应该模拟硬币翻转(正面= 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),而不是让平均值给您一些有意义的信息。