In [1]:
import numpy
import tqdm
In [2]:
T1 = ["ESP", "GER", "ITA", "POR", "ENG", "UKR", "FRA", "RUS"]    
T2 = ["ESP", "ESP", "ESP", "ENG", "ENG", "GER", "POR", "FRA"]
T3 = ["ENG", "ENG", "ITA", "ITA", "SUI", "GRE", "BEL", "TUR"]
T4 = ["GER", "SCO", "RUS", "POR", "CYP", "NED", "SLO", "AZE"]
In [3]:
def make_draw():
    T1R = numpy.random.permutation(T1)
    T2R = numpy.random.permutation(T2)
    T3R = numpy.random.permutation(T3)
    T4R = numpy.random.permutation(T4)
    draw = numpy.array([T1R, T2R, T3R, T4R])
    return draw
In [4]:
def is_valid(draw, country_protection=True):
    if country_protection:
        return all(len(numpy.unique(draw[:,i]))==4 for i in range(draw.shape[1]))
    else:
        return True

def is_good(draw):
    return any(all(c not in draw[:,i] for c in ("ESP", "GER", "ENG")) for i in range(draw.shape[1]))
In [5]:
# some testing:
for i in range(5):
    draw = make_draw()
    while not is_valid(draw):
        draw = make_draw()
    print(draw)
    print("Good: %s" % is_good(draw))
[['ITA' 'POR' 'ENG' 'UKR' 'GER' 'ESP' 'FRA' 'RUS']
 ['ESP' 'GER' 'POR' 'ESP' 'ENG' 'FRA' 'ENG' 'ESP']
 ['ENG' 'ITA' 'SUI' 'GRE' 'BEL' 'ENG' 'ITA' 'TUR']
 ['CYP' 'RUS' 'GER' 'NED' 'AZE' 'POR' 'SLO' 'SCO']]
Good: False
[['GER' 'POR' 'ESP' 'ITA' 'UKR' 'ENG' 'RUS' 'FRA']
 ['ESP' 'GER' 'ENG' 'ESP' 'ESP' 'POR' 'FRA' 'ENG']
 ['ENG' 'SUI' 'BEL' 'ENG' 'ITA' 'ITA' 'GRE' 'TUR']
 ['SCO' 'SLO' 'CYP' 'GER' 'POR' 'NED' 'AZE' 'RUS']]
Good: True
[['UKR' 'ESP' 'ITA' 'GER' 'ENG' 'FRA' 'RUS' 'POR']
 ['ENG' 'ENG' 'ESP' 'ESP' 'GER' 'ESP' 'POR' 'FRA']
 ['SUI' 'GRE' 'ENG' 'BEL' 'TUR' 'ENG' 'ITA' 'ITA']
 ['AZE' 'SLO' 'SCO' 'RUS' 'NED' 'POR' 'CYP' 'GER']]
Good: True
[['GER' 'RUS' 'FRA' 'ITA' 'ESP' 'POR' 'ENG' 'UKR']
 ['ESP' 'ENG' 'ENG' 'POR' 'FRA' 'ESP' 'ESP' 'GER']
 ['GRE' 'ITA' 'TUR' 'ENG' 'BEL' 'ENG' 'ITA' 'SUI']
 ['RUS' 'POR' 'CYP' 'SLO' 'SCO' 'AZE' 'GER' 'NED']]
Good: False
[['ESP' 'ENG' 'ITA' 'POR' 'UKR' 'FRA' 'GER' 'RUS']
 ['GER' 'ESP' 'ESP' 'ENG' 'FRA' 'POR' 'ESP' 'ENG']
 ['GRE' 'TUR' 'BEL' 'SUI' 'ENG' 'ENG' 'ITA' 'ITA']
 ['POR' 'RUS' 'AZE' 'NED' 'CYP' 'GER' 'SCO' 'SLO']]
Good: False
In [7]:
def run(num_trials, country_protection):
    count = valid = good = 0
    for _ in tqdm.tqdm(xrange(int(num_trials))):
        draw = make_draw()
        count += 1
        if is_valid(draw, country_protection):
            valid += 1
            if is_good(draw):
                good += 1
    print("count=%d" % count)
    print("valid=%d" % valid)
    print("good=%d" % good)
    print("%d/%d=%f" % (good, valid, float(good)/float(valid)))
In [8]:
# 1 mio trials, with country protection
run(1e6, True)
100%|██████████| 1000000/1000000 [01:17<00:00, 12873.34it/s]
count=1000000
valid=45978
good=20688
20688/45978=0.449954

              
In [9]:
# 1 mio trials, without country protection
run(1e6, False)
100%|██████████| 1000000/1000000 [01:11<00:00, 13922.80it/s]
count=1000000
valid=1000000
good=677223
677223/1000000=0.677223

              
In [ ]: