In [1]:
import itertools
import functools
from numpy.random import choice
from IPython.display import clear_output

In [2]:
HOME_WIN_PCT = .54
AT_LEAST_CONSEC_LOSSES = 5
TOTAL_GAMES = 7
HOME_LOSS = 1
HOME_WIN = 0
A_HOME = (0,1,5,6)

In [7]:
@functools.lru_cache(256)
def series_outcome(games):
    a_wins = 0
    b_wins = 0
    series = []
    for i, g in enumerate(games):
        if i in A_HOME:
            if g == HOME_WIN:
                a_wins += 1
            else:
                b_wins += 1
        else:
            if g == HOME_WIN:
                b_wins += 1
            else:
                a_wins += 1
        
        series.append(g)
        
        if a_wins == 4 or b_wins == 4:
            break  

    return tuple(series)

In [4]:
NUM_TRIALS = 5000000

In [10]:
@functools.lru_cache(256)
def consec_losses(series):
    groups = itertools.groupby(series)

    try:
        consec_losses = max([sum(group) for label, group in groups if label == HOME_LOSS])
    except ValueError:
        consec_losses = 0
        
    return consec_losses

In [16]:
AT_LEAST_CONSEC_LOSSES = 6

In [17]:
at_least_loss_count = 0

for i,n in enumerate(range(NUM_TRIALS)):
    games = series_outcome(tuple(choice((HOME_WIN, HOME_LOSS), 7, p=[HOME_WIN_PCT, 1-HOME_WIN_PCT])))
    
    c_losses = consec_losses(games)

    if c_losses >= AT_LEAST_CONSEC_LOSSES:
        at_least_loss_count += 1

    if (i % 1000)== 0 and i != 0:
        clear_output()
        print(i, at_least_loss_count / i)


4999000 0.009466493298659732

In [18]:
AT_LEAST_CONSEC_LOSSES = 5

In [19]:
at_least_loss_count = 0

for i,n in enumerate(range(NUM_TRIALS)):
    games = series_outcome(tuple(choice((HOME_WIN, HOME_LOSS), 7, p=[HOME_WIN_PCT, 1-HOME_WIN_PCT])))
    
    c_losses = consec_losses(games)

    if c_losses >= AT_LEAST_CONSEC_LOSSES:
        at_least_loss_count += 1

    if (i % 1000)== 0 and i != 0:
        clear_output()
        print(i, at_least_loss_count / i)


4999000 0.02063372674534907

In [20]:
AT_LEAST_CONSEC_LOSSES = 4

In [21]:
at_least_loss_count = 0

for i,n in enumerate(range(NUM_TRIALS)):
    games = series_outcome(tuple(choice((HOME_WIN, HOME_LOSS), 7, p=[HOME_WIN_PCT, 1-HOME_WIN_PCT])))
    
    c_losses = consec_losses(games)

    if c_losses >= AT_LEAST_CONSEC_LOSSES:
        at_least_loss_count += 1

    if (i % 1000)== 0 and i != 0:
        clear_output()
        print(i, at_least_loss_count / i)


4999000 0.08082416483296659

In [22]:
AT_LEAST_CONSEC_LOSSES = 3

In [23]:
at_least_loss_count = 0

for i,n in enumerate(range(NUM_TRIALS)):
    games = series_outcome(tuple(choice((HOME_WIN, HOME_LOSS), 7, p=[HOME_WIN_PCT, 1-HOME_WIN_PCT])))
    
    c_losses = consec_losses(games)

    if c_losses >= AT_LEAST_CONSEC_LOSSES:
        at_least_loss_count += 1

    if (i % 1000)== 0 and i != 0:
        clear_output()
        print(i, at_least_loss_count / i)


4999000 0.2317971594318864

In [ ]: