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 排列计算的性能速度;重复=15
python中itertools模块zip_longest函数实现逻辑