在尝试测试知道随机数的历史记录是否可以帮助预测将来的结果时,我发现生成的平均值与正确猜测的数量之间存在强烈的,意料之外的关联。
该测试应该模拟硬币翻转(正面= 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");
}
Run Code Online (Sandbox Code Playgroud)
代码出错了吗?这是自然的关系吗?我希望随着尝试次数的增加,平均数会收敛于0.5,因为分布相当均匀-我用100亿次呼叫测试了这一点Random.Next(0,2)-但我并不期望生成的数字总和与正确猜测的数量相关。
您的错误是此行:
avg = (decimal)sum/(decimal)attempts;
Run Code Online (Sandbox Code Playgroud)
用尝试将总和(基于到该点的i)除以没有意义。除以i(编辑:更准确地说是i + 1),而不是平均,可以给您带来一些有意义的东西。