2013-11-24 49 views
0

我試圖做一個python腳本來計算一些贏/失機會。 做到這一點我試圖下車的戰績所有可能的組合(K是贏得比賽所需的勝場數):python itertools產品重複到大

for combination in itertools.product(['W','L'], repeat=(K*2)-1): 
    if ((combination.count('L') < K) and (combination.count('W') == K)): 
     #calculate the chance of this situation happening 

由於某種原因,這工作得很好,直到重複變成大(例如,如果K = 25) 有人可以給我一些指導如何解決這個問題嗎?

+2

答案在於數學而不是代碼。 – 0xc0de

回答

4

當重複變大時,它當然失敗。循環

for combination in itertools.product(['W','L'], repeat=(K*2)-1): 

重複通過2**(K*2-1)元素,它會非常快地變得非常大。例如,當K = 3時,循環執行32次,但當K = 25時,執行562949953421312次。你不應該窮盡地列舉所有可能的組合。有一點數學可以幫助你:參見Binomial Distribution

下面是如何使用二項分佈來解決問題:如果有機會贏得一場比賽是p,然後有機會失去的是1-P。你想知道什麼是獲勝的概率kn遊戲。它是:

(n choose k) * p**k (1 - p)**(n - k) 

這裏(n choose k)是具有完全相同ķ勝組合的數量。

+0

我得到這個工作,但我有點困惑的數學。 如果獲勝的機會取決於之前的結果,我會如何去做同樣的事情? (如果以前的結果也是勝利,贏的機會增加) – user3027128

+0

這是一個更難的問題。您可能需要在math.stackexchange.com上詢問。分佈將取決於依賴關係是什麼,它可能沒有封閉解決方案(意思是公式)。 – Max

0

下面爲您提供了一個線索:

>>> for K in range(1,11): 
...  n = 0 
...  for combination in itertools.product(['W','L'], repeat=(K*2)-1): 
...   n+=1 
...  print (K,n), 
... 
(1, 2) (2, 8) (3, 32) (4, 128) (5, 512) (6, 2048) (7, 8192) (8, 32768) (9, 131072) (10, 524288) 
>>> 

所以,你將不得不等待時間在K = 25的結果。也許是時候計算出你的概率,而不是簡單地計算它!