python itertools产品重复到大

时间:2013-11-24 11:46:46

标签: python probability product itertools

我正在尝试制作一个python脚本来计算一些赢/输机会。 为了做到这一点,我试图获得所有可能的组合胜负(K是赢得比赛所需的胜利数量):

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 个答案:

答案 0 :(得分: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 。您想知道从 n 游戏中赢取 k 的概率是多少。它是:

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

此处(n choose k)是完全 k 获胜的组合数。

答案 1 :(得分: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的结果。也许是时候计算出你的概率而不是简单地计算它了!