Python :: Aufgabe #277
1 Lösung
Abschätzung der Gewinnchancen eines KENO-Types
Anfänger - Python
von hollst
- 08.05.2020 um 22:39 Uhr
Zur Erinnerung, was ist KENO: Aus 70 Zahlen werden 20 Gewinnzahlen per Zufallsgenerator ermittelt.
Es gibt die KENO-Typen 2, 3 ... 10, d. h. man kann 2, 3 ... 10 Zahlen aus den Zahlen 1 ... 70 wählen.
Bei KENO-Typ N können 0, 1 ... N gewählte Zahlen in den 20 gelosten Gewinnzahlen enthalten sein
(je mehr, desto höher natürlich der Gewinn).
Die Programmieraufgabe bestehe darin, mittels stochastischer Simulation die Wahrscheinlichkeit dafür abzuschätzen,
wie hoch die Chance ist, bei KENO-Typ N, 0, 1, 2 ... oder gar N Richtige auf seinem Tippzettel zu haben?
Die exakten Werte könnt ihr u. a. z. B. auf
https://www.sachsenlotto.de/portal/spiele/keno/gewinnquoten.jsp
nachsehen.
Es gibt die KENO-Typen 2, 3 ... 10, d. h. man kann 2, 3 ... 10 Zahlen aus den Zahlen 1 ... 70 wählen.
Bei KENO-Typ N können 0, 1 ... N gewählte Zahlen in den 20 gelosten Gewinnzahlen enthalten sein
(je mehr, desto höher natürlich der Gewinn).
Die Programmieraufgabe bestehe darin, mittels stochastischer Simulation die Wahrscheinlichkeit dafür abzuschätzen,
wie hoch die Chance ist, bei KENO-Typ N, 0, 1, 2 ... oder gar N Richtige auf seinem Tippzettel zu haben?
Die exakten Werte könnt ihr u. a. z. B. auf
https://www.sachsenlotto.de/portal/spiele/keno/gewinnquoten.jsp
nachsehen.
Lösungen:
Python-Code
# fuer das Mischen der Liste import random # manuelle Exception bei Eingaben außerhalb des zulässigen Bereiches class RangeError(Exception): pass # Formatierung einer Zahl mit Tausender-Trennzeichen def dot(number): return format(number,',d').replace(',','.') # Anzahl der Nummern NO_KENO_NUMBERS = 70 # Anzahl der Gewinnzahlen NO_WINNING_NUMBERS = 20 # Anzahl der Durchläufe, für die jeweils ein Fortschrittspunkt ausgegeben werden soll PROGRESS_DOT = 25000 # Eingabe des KENO-Sytems while True: try: system = int(input('\nWelcher KENO-Typ (2 bis 10) soll simuliert werden -> ')) if system in list(range(2, 11)): break else: raise RangeError except ValueError: print('Bitte eine Ganzzahl für den KENO-Typ eingeben.') except RangeError: print('Die Zahl muss zwischen 2 und 10 liegen.') # Eingabe der Anzahl an Durchläufen while True: try: no_iterations = int(input('\nWie viele Durchläufe sollen simuliert werden -> ')) if no_iterations > 0: break else: raise RangeError except ValueError: print('Bitte eine Ganzzahl für die Anzahl an Durchläufen eingeben.') except RangeError: print('Die Anzahl der Durchläufe muss größer als Null sein.') # Festlegung der Spielernummern player_numbers = list(range(1, system + 1)) # Anlegen des Dictionaries, in dem die Ergebnisse gespeichert werden result_dict = {} for index in range(0, system + 1): result_dict[index] = 0 print('WORK IN PROGRESS ', end='') # Simulieren der definierten Anzahl an Durchläufen for iteration in range(no_iterations): keno_numbers = list(range(1, NO_KENO_NUMBERS + 1)) random.shuffle(keno_numbers) winning_numbers = [] for index in range(NO_WINNING_NUMBERS): winning_numbers.append(keno_numbers.pop()) winning_numbers.sort() no_right_numbers = 0 for element in player_numbers: if element in winning_numbers: no_right_numbers += 1 result_dict[no_right_numbers] += 1 if iteration % PROGRESS_DOT == 0: print('.', end='') # Ausgabe der Ergebnisse headline = f'\nErgebnisse "KENO {system}" ({dot(no_iterations)} Durchläufe)' separator = len(headline) * '-' print(headline) print(separator) for element in result_dict: print(f'{element:>2} Richtige: {dot(result_dict[element]):>10} mal ->{result_dict[element]/no_iterations*100:>9.5f}%') print(separator)