2013-01-13 37 views
0

假設我想在Python中模擬一個經典問題:有一個包含55%紅色球和45%綠色球的包。Monte Carlo模擬過程中random.sample函數的意外行爲

我想提取10個球,並檢測所有這些球是綠色的可能性是什麼。

我用蒙特卡羅模擬,使用功能random.sample(球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增長時,返回的數字收斂到真正的概率?

回答

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. 

doc

正確probabilty(你MC)是:

In [30]: np.prod(np.arange(36,46)/np.arange(91.0,101)) 
Out[30]: 0.00018429406441449519 
+0

啊!我想你是對的 :)。大聲笑。我沒有注意到。我現在會嘗試。 – alinsoar

+0

對!解決了 。謝謝 ! – alinsoar