在尝试测试是否知道随机数的历史可以帮助预测未来结果时,我发现生成的数字的平均值与正确猜测的数量之间存在强烈的,意外的相关性。
该测试应该模拟翻转硬币(头部= 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亿次调用对此进行了测试 - 但我没想到生成数字的总和与数字相关正确的猜测。
答案 0 :(得分:4)
您的错误就在这一行:
avg = (decimal)sum/(decimal)attempts;
通过尝试将总和(基于i到该点)除以是没有意义的。除以i(编辑:更确切地说是i + 1)而不是avg给你一些有意义的东西。
答案 1 :(得分:-3)
没有种子的Random类使用当前时间作为种子生成一个随机数,这意味着在你的循环中调用rnd.Next方法将导致相同的数字多次,这取决于你的速度有多快机器经历了这个循环。