0

Python で古典的な問題をシミュレートしたいとします。赤いボールが 55%、緑のボールが 45% のバッグがあります。

10 個のボールを抽出し、これらすべてのボールが緑色である確率を検出したいと考えています。

次のように関数 random.sample(balls, 10) を使用して、モンテカルロ シミュレーションを使用します。

from random import choice, shuffle, sample, randint

Red = False
Green = True

bags = [Red for _ in range(55)]
bags.extend([Green for _ in range(45)])
# shuffle(bags)

def testonce():
    return all(sample(bags, 10))

def test(N):
    K = 0
    for _ in xrange(N): K += testonce()
    return float(K)/N

print '/', test (10000000)
print ':', .45**10

このコードは、シミュレーションによって検出された確率と、実際の確率 (正解) を出力します。次のように出力されます。

/ 0.0001848
: 0.00034050628916

この違いは私にそれを示しています

  • ランダムモジュールが間違っているか

  • 何かを見逃しているか、コードで何か間違ったことをしています。

何が恋しいですか?Nが大きくなると、返される数値が実際の確率に収束するように、シミュレーションを正しく記述する方法は?

4

1 に答える 1

2

radom.sample置換なしを選択した場合、置換ありの確率を計算しています。

random.sample(population, k)
    Return a k length list of unique elements chosen from the population sequence. Used for random sampling without replacement.

(ドキュメント)

正しい確率 (MC の場合) は次のとおりです。

In [30]: np.prod(np.arange(36,46)/np.arange(91.0,101))
Out[30]: 0.00018429406441449519
于 2013-01-13T08:05:49.797 に答える