同様@Henry、私は本当にあなたのソリューションは、モンテカルロであることを感じることはありません。確かに、ディストリビューションからサンプリングしますが、データ生成プロセスを模倣することとはあまり関係がありません。モンテカルロを使用して、理論的な解決策が正しいことを誰かに納得させたい場合は、データ生成プロセスを模倣する解決策を使用する必要があります。私はそれが以下のようなものになると想像します:
boxes <- list(
c(0, 0),
c(0, 1),
c(1, 1)
)
count_successes = 0
count_valid_samples = 0
for (i in 1:5000) {
sampled_box <- unlist(sample(boxes, 1)) # sample box
sampled_balls <- sample(sampled_box) # shuffle balls in the box
if (sampled_balls[1] == 1) { # if first ball is golden
if (sampled_balls[2] == 1) { # if second ball is golden
count_successes = count_successes + 1
}
count_valid_samples = count_valid_samples + 1
}
}
count_successes / count_valid_samples
または、「ベクトル化された」コードを使用します。
mean(replicate(5000, { # repeat 5000 times, next calculate empirical probability
x <- boxes[[sample(3, 1)]] # pick a box
if (x[sample(2, 1)] == 1) # pick a ball, check if it is golden
return(sum(x) == 2) # check if you have two golden balls in the box
else
return(NA) # ignore if sampled ball is silver
}), na.rm = TRUE) # not count if silver
最初のボールがすでに描かれ、それが黄金色であるという事実を条件としているため、上記のコードは単純に2つのボックスboxes <- list(c(0, 1), c(1, 1))
を使用しx <- boxes[[sample(2, 1)]]
、それらからサンプリングできるため、コードは1/3にならないため高速になります割引する空のラン。ただし、問題は単純で、コードは高速で実行されるため、データ生成プロセス全体を明示的にシミュレートして、結果が正しいことを「確認」する余裕があります。それに加えて、両方のケースで同じ結果が得られるため、この手順は必要ありません。
x <- boxes[[sample(3, 1)]]
は3つの箱から箱を取ることを意味しますか?もしそうなら、なぜあなたはすでに金のボールを選んだことがわかっているので、なぜそれが必要ですか?