In [44]:
niete, nebengewinn, hauptgewinn = 'N', 'G', 'H'
lostrommel = [hauptgewinn] + 19 * [nebengewinn] + 80 * [niete]
assert len(lostrommel) == 100
In [49]:
# Indikatorfunktionen für Ereignisse
event_checks = dict(
A = lambda: hauptgewinn in draw,
B = lambda: draw != 4 * [niete],
C = lambda: sum(los != niete for los in draw) <= 1,
D = lambda: sorted(draw) == [nebengewinn, niete, niete, niete]
)
# Anzahl der Versuche
N = 100000
# Zähler für absolute Häufigkeiten der Ereignisse bei N Versuchen
# Ausgabe
def show_events():
return ' '.join(event if event in events else '_'
for event in sorted(event_checks))
Nun wird für N zufällige Ziehungen gezählt, wie häufig die jeweiligen Ergnissen eintreten.
In [50]:
from collections import defaultdict
from itertools import product
from random import sample
print(" n Lose Ereignisse\n───────────────────────────")
event_counters = defaultdict(int)
for n in range(N): # Versuch n = 0 ... (N-1)
# zufällige Auswahl von 4 Losen
draw = sample(lostrommel, 4)
# prüfe ob Ereignis A, B, C, D eintritt
events = [name for name, check in event_checks.items() if check()]
# Zähler für eingetretene Ereignisse inkrementieren
for name in events: event_counters[name] += 1
# Ausgabe
if n < 10:
print("{:^3d} {:^11} {:^9}".format(n, ' '.join(draw), show_events()))
elif n == 10:
print(" ...")
In [47]:
for name, count in sorted(event_counters.items()):
print("H({}) = {:5d}/{} = {:.03f}".format(name, count, N, count / N))