我在理解以下结果时遇到了一些麻烦。
我想知道以下代码是否确实正确。它让我很难过 - 但这可能是由于我误解了所涉及的概率。
代码应该说明一切,但澄清“真实世界”的模拟代表了两个人掷硬币。当你输了,你支付1美元,当你赢了,你赢了一美元。一场平和游戏!
private static Random rnd = new Random();
public static void main(String[] args) {
int i=0;
for (int x = 0; x<1000000; x++) {
if (rnd.nextBoolean()) i+=1;
else i-=1;
}
System.out.println(i);
}
当我跑步时,我会得到巨大的波动!虽然我希望像这样的大样本收敛到0,但我看到+ -4000
不仅如此,增加样本量似乎只会使波动更高。
我是否滥用了随机功能? :P
答案 0 :(得分:3)
我觉得你很好。要注意的是摆动与样品的比例。
例如,100万像素中的4000例是0.4%如果你增加样本量,你应该期望这个比例下降。
答案 1 :(得分:1)
您的实验结果应遵循binomial distribution。如果 试验次数为N,成功概率为p = 1/2,则为 成功的次数N_success(对于足够大的N)应该具有大约Np的平均值, 和标准差sqrt(N * p *(1-p))。
您实际上正在跟踪K =(N_success - N_fail)。所以N_success = N / 2 + K / 2。 通过1,000,000次试验和K = 4000,我们得到N_success = 502000。预期 值为500000,标准差sqrt(250000)= 500.差异 在N_success的观察值和期望值之间是2000,或大约4西格玛。 这足以质疑随机数发生器是否是 失之偏颇。另一方面,如果你运行这个测试数千次, 你会期待一些如此规模的异常值,你似乎看到了两者 正面和负面的价值,所以从长远来看也许事情还可以。
答案 2 :(得分:1)
您正在模拟one-dimensional random walk。基本上,想象自己站在一条整数线上。你从点i=0
开始。您可以以相同的概率向右或向左迈出一步。
随机游走有一些很酷的属性,你已经触及了我的最爱:
i=0
开始,当N变大时,你返回到该点的概率接近1.正如你所指出的 - 零和游戏。由于平均值应为0且 N 的方差移动 N ,因此您可以预期95%的模拟结束在该地区:( - 1.96,1.96)* N ^(0.5)。