python itertools 产品重复到大

Posted

技术标签:

【中文标题】python itertools 产品重复到大【英文标题】:python itertools product repeat to big 【发布时间】:2013-11-24 11:46:46 【问题描述】:

我正在尝试制作一个 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) 有人可以给我一些关于如何解决这个问题的指示吗?

【问题讨论】:

答案在于数学而不是代码。 【参考方案1】:

当然,当重复变大时它会失败。循环

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 次获胜的组合数。

【讨论】:

我得到了这个工作,但我对数学有点困惑。如果获胜的机会取决于前一次的结果,我将如何做同样的事情? (如果之前的结果也是胜利,则获胜的机会增加) 这是一个更难的问题。您可能需要在 math.stackexchange.com 上提问。分布将取决于确切的依赖关系,并且它可能没有封闭形式的解决方案(意思是公式)。【参考方案2】:

以下为你提供线索:

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

【讨论】:

以上是关于python itertools 产品重复到大的主要内容,如果未能解决你的问题,请参考以下文章

python字典值的itertools产品

Python - 提高 Itertools 排列计算的性能速度;重复=15

python中itertools模块zip_longest函数实现逻辑

Itertools 产品 V​​alueError:解包的值太多(预期为 2)

Python循环器-itertools

python itertools