我正在教一门统计课,让学生通过使用 R 的模拟来探索概率和统计方面的问题。最近,人们对掷 5 个骰子时恰好得到两个 6 的概率有些困惑。答案是choose(5,2)*5^3/6^5,但也有同学认为“顺序不重要”;即答案应该是choose(5,2)*choose(25,3)/choose(30,5)。我认为让他们模拟滚动 5 个骰子数千次,跟踪每个实验的经验概率,然后重复该实验多次会很有趣。问题是上面的两个数字足够接近,以至于很难通过模拟以统计上显着的方式梳理出差异(当然我可能做错了)。我试着掷 5 个骰子 100000 次,然后重复实验 10000 次。这需要一个小时左右才能在我的 i7 linux 机器上运行,并且仍然有 25% 的机会正确答案是选择(5,2)*选择(25,3)/选择(30,5)。所以我将每个实验的掷骰数增加到 10^6。现在代码已经运行了 2 多天,并且没有完成的迹象。我对此感到困惑,因为我只将操作数量增加了一个数量级,这意味着运行时间应该接近 10 小时。现在代码已经运行了 2 多天,并且没有完成的迹象。我对此感到困惑,因为我只将操作数量增加了一个数量级,这意味着运行时间应该接近 10 小时。现在代码已经运行了 2 多天,并且没有完成的迹象。我对此感到困惑,因为我只将操作数量增加了一个数量级,这意味着运行时间应该接近 10 小时。
第二个问题:有没有更好的方法来做到这一点?请参阅下面发布的代码:
probdist = rep(0,10000)
for (j in 1:length(probdist))
{
outcome = rep(0,1000000)
for (k in 1:1000000)
{
rolls = sample(1:6, 5, replace=T)
if (length(rolls[rolls == 6]) == 2) outcome[k] = 1
}
probdist[j] = sum(outcome)/length(outcome)
}