niete, nebengewinn, hauptgewinn = 'N', 'G', 'H'
lostrommel = [hauptgewinn] + 19 * [nebengewinn] + 80 * [niete]
assert len(lostrommel) == 100

"""
Explanation: WT-Übung 1 - Aufgabe 5
100 Lose, davon 20 Gewinne, davon ein Hauptgewinn. Es werden vier Lose gezogen.

A = {Hauptgewinn wird gezogen}
B = {mindestens ein Gewinn}
C = {höchstens ein Gewinn}
D = {genau ein Nebengewinn}
End of explanation
"""


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

"""
Explanation: Lösung
Gesucht ist die Wahrscheinlichkeit für die Ereignisse A, B, C und D. Hier wird die relative Häufigkeit als Schätzer verwendet (siehe Satz 7.8-2).
End of explanation
"""


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(" ...")

"""
Explanation: Nun wird für N zufällige Ziehungen gezählt, wie häufig die jeweiligen Ergnissen eintreten.
End of explanation
"""


for name, count in sorted(event_counters.items()):
    print("H({}) = {:5d}/{} = {:.03f}".format(name, count, N, count / N))

"""
Explanation: Ergebnis
Aus den so bestimmten absoluten Häufigkeiten werden schließlich die zugehötigen relativen Häufigkeiten gebildet
End of explanation
"""


