概率和编程模拟

时间:2011-03-23 18:06:50

标签: java statistics

我在理解以下结果时遇到了一些麻烦。

我想知道以下代码是否确实正确。它让我很难过 - 但这可能是由于我误解了所涉及的概率。

代码应该说明一切,但澄清“真实世界”的模拟代表了两个人掷硬币。当你输了,你支付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

3 个答案:

答案 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)。