我正在尝试制作一个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) 有人可以给我一些关于如何解决这个问题的建议吗?
答案 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的结果。也许是时候计算出你的概率而不是简单地计算它了!