100 lines
3.3 KiB
Python
100 lines
3.3 KiB
Python
|
import random
|
||
|
import time
|
||
|
|
||
|
|
||
|
def ziehung():
|
||
|
"""Simuliert eine Lottoziehung und gibt die gezogenen Zahlen zurück."""
|
||
|
return sorted(random.sample(range(1, 50), 6))
|
||
|
|
||
|
|
||
|
def nutzer_tipp():
|
||
|
"""Fragt den Nutzer nach seinem Tipp und gibt die Zahlen als Liste zurück."""
|
||
|
while True:
|
||
|
try:
|
||
|
tipp = input("Geben Sie Ihren Tipp (6 Zahlen zwischen 1 und 49, durch Kommas getrennt) ein: ")
|
||
|
tipp_liste = [int(x.strip()) for x in tipp.split(',')]
|
||
|
if len(tipp_liste) != 6 or not all(1 <= x <= 49 for x in tipp_liste):
|
||
|
raise ValueError
|
||
|
return sorted(tipp_liste)
|
||
|
except ValueError:
|
||
|
print("Ungültige Eingabe. Bitte geben Sie genau 6 gültige Zahlen ein.")
|
||
|
|
||
|
|
||
|
def berechne_richtige(tipp, gezogene_zahlen):
|
||
|
"""Berechnet die Anzahl der richtigen Tipps."""
|
||
|
return len(set(tipp) & set(gezogene_zahlen))
|
||
|
|
||
|
|
||
|
def lottosimulation(anzahl_simulationen):
|
||
|
"""Führt die Lottosimulation durch und gibt die Ergebnisse aus."""
|
||
|
tipp = nutzer_tipp()
|
||
|
ergebnisse = [0] * 7 # Index 0-6 für 0 bis 6 richtige Tipps
|
||
|
|
||
|
start_time = time.time()
|
||
|
|
||
|
for _ in range(anzahl_simulationen):
|
||
|
gezogene_zahlen = ziehung()
|
||
|
richtige = berechne_richtige(tipp, gezogene_zahlen)
|
||
|
ergebnisse[richtige] += 1
|
||
|
|
||
|
end_time = time.time()
|
||
|
laufzeit = end_time - start_time
|
||
|
|
||
|
# Ausgabe der Ergebnisse
|
||
|
print("\nErgebnisse der Simulation:")
|
||
|
for i in range(7):
|
||
|
relative_haeufigkeit = ergebnisse[i] / anzahl_simulationen * 100
|
||
|
print(f"{i} richtige Zahlen: {ergebnisse[i]} ({relative_haeufigkeit:.2f}%)")
|
||
|
|
||
|
# Exakte Gewinnwahrscheinlichkeiten
|
||
|
exakte_wahrscheinlichkeiten = [berechne_exakte_wahrscheinlichkeit(i) for i in range(7)]
|
||
|
print("\nExakte Gewinnwahrscheinlichkeiten:")
|
||
|
for i in range(7):
|
||
|
abweichung = relative_haeufigkeit - exakte_wahrscheinlichkeiten[i] * 100
|
||
|
print(f"{i} richtige Zahlen: {exakte_wahrscheinlichkeiten[i] * 100:.6f}% (Abweichung: {abweichung:.2f}%)")
|
||
|
|
||
|
print(f"\nLaufzeit der Simulation: {laufzeit:.4f} Sekunden")
|
||
|
|
||
|
|
||
|
def berechne_exakte_wahrscheinlichkeit(richtige):
|
||
|
"""Berechnet die exakte Wahrscheinlichkeit für die Anzahl der richtigen Tipps."""
|
||
|
auswahl = 6
|
||
|
gesamt = 49
|
||
|
if richtige < 0 or richtige > 6:
|
||
|
return 0
|
||
|
falsch = auswahl - richtige
|
||
|
if falsch > 6:
|
||
|
return 0
|
||
|
# Kombinationen berechnen
|
||
|
kombinationen_richtig = comb(6, richtige)
|
||
|
kombinationen_falsch = comb(43, falsch) # 43 = 49 - 6
|
||
|
gesamt_kombinationen = comb(49, 6)
|
||
|
return (kombinationen_richtig * kombinationen_falsch) / gesamt_kombinationen
|
||
|
|
||
|
|
||
|
def comb(n, k):
|
||
|
"""Berechnet die Kombinationen von n über k (n choose k)."""
|
||
|
if k > n:
|
||
|
return 0
|
||
|
if k == 0 or k == n:
|
||
|
return 1
|
||
|
k = min(k, n - k) # Nutzen der Symmetrie
|
||
|
numer = 1
|
||
|
denom = 1
|
||
|
for i in range(k):
|
||
|
numer *= (n - i)
|
||
|
denom *= (i + 1)
|
||
|
return numer // denom
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
while True:
|
||
|
try:
|
||
|
anzahl_simulationen = int(input("Wie oft möchten Sie die Ziehung simulieren? "))
|
||
|
if anzahl_simulationen <= 0:
|
||
|
raise ValueError
|
||
|
break
|
||
|
except ValueError:
|
||
|
print("Bitte geben Sie eine positive ganze Zahl ein.")
|
||
|
|
||
|
lottosimulation(anzahl_simulationen)
|