私は統計学のクラスを教えており、学生に R を使用したシミュレーションを通じて確率と統計学の問題を探させています。最近、5 つのサイコロを振ったときにちょうど 2 つの 6 が出る確率について混乱がありました。答えは choose(5,2)*5^3/6^5 ですが、一部の学生は「順序は問題にならない」と確信していました。つまり、答えは choose(5,2)*choose(25,3)/choose(30,5) になります。5つのサイコロを何千回も振ってシミュレートし、各実験の経験的確率を追跡し、実験を何度も繰り返すと面白いと思いました。問題は、上記の 2 つの数値が十分に近いため、統計的に有意な方法で違いを引き出すためのシミュレーションを取得するのが非常に難しいことです (もちろん、私のやり方が間違っている可能性もあります)。5個のサイコロを100000回振ってから、実験を10000回繰り返してみました。これを i7 Linux マシンで実行するのに 1 時間ほどかかりましたが、25% の確率で正しい答えが choose(5,2)*choose(25,3)/choose(30,5) になる可能性がありました。そこで、1 回の実験でサイコロを振る回数を 10^6 に増やしました。現在、コードは 2 日以上実行されており、終了の兆候は見られません。操作の数を 1 桁だけ増やしただけなので、実行時間が 10 時間近くになるはずであることを意味しているため、これには混乱しています。現在、コードは 2 日以上実行されており、終了の兆候は見られません。操作の数を 1 桁だけ増やしただけなので、実行時間が 10 時間近くになるはずであることを意味しているため、これには混乱しています。現在、コードは 2 日以上実行されており、終了の兆候は見られません。操作の数を 1 桁だけ増やしただけなので、実行時間が 10 時間近くになるはずであることを意味しているため、これには混乱しています。
2 番目の質問: これを行うためのより良い方法はありますか? 以下に投稿されたコードを参照してください。
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)
}