Python :: Aufgabe #277

1 Lösung Lösung öffentlich

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.

Lösungen:

vote_ok
von Klaus (730 Punkte) - 09.06.2020 um 16:01 Uhr
Quellcode ausblenden 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)