python itertools product repeat to big

烂漫一生 提交于 2020-06-23 13:26:47

问题


I'm trying to make a python script to calculate some win/loss chances. to do this i'm trying to get all possible combinations off wins and losses (K is the number of wins needed to win the game):

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

for some reason this works fine, until the repeat becomes to big (for instance if K=25) Can someone give me some pointers on how to solve this?


回答1:


Of course it fails when the repeat becomes large. The loop

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

iterates through 2**(K*2-1) elements, which becomes prohibitively large very quickly. For example, when K=3, the loop executes 32 times, but when K=25 it executes 562949953421312 times.

You should not exhaustively try to enumerate all possible combination. A little bit of mathematics can help you: see Binomial Distribution.

Here is how to use the Binomial Distribution to solve your problem: If chance to win a single game is p, then the chance to lose is 1-p. You want to know what is the probability of winning k out of n games. It is:

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

Here (n choose k) is the number of combinations that have exactly k wins.




回答2:


The following gives you a clue:

>>> 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)
>>> 

So you are going to have to wait a long time for a result at K=25. maybe it is time to work out your probability rather than simply calculating it!



来源:https://stackoverflow.com/questions/20174090/python-itertools-product-repeat-to-big

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!