Zufall
In dieser Lektion simulieren wir Wahrscheinlichkeiten und Zufall.
Wir verwenden die random-Bibliothek, um Zufallszahlen zu generieren und Wahrscheinlichkeiten zu simulieren.
Wichtige Funktionen der random-Bibliothek
Die random-Bibliothek stellt verschiedene Funktionen bereit:
Aufgabe 1: wuerfeln()-Funktion für einen 6-seitigen Würfel
Schreiben Sie nun eine Funktion wuerfeln(), mit der wir einen sechseitigen Würfel simulieren und die Augenzahl mit return zurückgeben.
Mögliche Lösungimport random def wuerfeln(): return random.randint(1, 6) # Einige Testaufrufe for i in range(20): print("Würfelwurf:", wuerfeln())
Aufgabe 2: Was ist die Wahrscheinlichkeit einen 6er zu würfeln?
Mathematisch könnten Sie leicht ausrechnen, was die Wahrscheinlichkeit ist, einen 6er zu würfeln.
Versuchen Sie nun, eine Million Würfelwürfe zu simulieren und rechnen Sie aus, ob sich das tatsächlich der mathematischen Wahrscheinlichkeit annähert.
Mögliche Lösungimport random versuche = 1_000_000 sechser = 0 for i in range(versuche): if random.randint(1, 6) == 6: sechser += 1 wahrscheinlichkeit = sechser / versuche print("Simulierte Wahrscheinlichkeit:", wahrscheinlichkeit) print("Mathematisch erwartet:", 1/6)Bei einer Million Versuchen kommt jeweils ein Wert sehr nahe an heraus. Mit weniger Versuchen wäre die Abweichung grösser — das ist das Gesetz der grossen Zahlen in Aktion.
Aufgabe 3: Mehrere 6er hintereinander würfeln
Schreiben Sie nun ein Programm, das eine Million Mal versucht, drei 6er hintereinander zu würfeln. In wie vielen Fällen hat es geklappt? Speichern Sie die Anzahl 6er in der Variable anzahl_erfolge.
Mögliche Lösungimport random def wuerfeln(): return random.randint(1, 6) versuche = 1_000_000 anzahl_erfolge = 0 for i in range(versuche): w1 = wuerfeln() w2 = wuerfeln() w3 = wuerfeln() if w1 == 6 and w2 == 6 and w3 == 6: anzahl_erfolge += 1 print("Drei 6er hintereinander:", anzahl_erfolge, "Mal") print("Erwartet mathematisch:", versuche * (1/6)**3, "Mal")Mathematisch ist die Wahrscheinlichkeit . Auf eine Million Versuche gerechnet erwartet man also ungefähr 4'630 Treffer.
Aufgabe 4: Ein Spiel mit Würfeln simulieren (einfache Variante)
Mit meinen Freunden haben wir das Brettspiel Siedler mit Soldaten erweitert, damit man sich gegenseitig die Dörfer und Städte zerstören kann. Dabei haben wir das Kampfsystem des Brettspiels "Risiko" übernommen. Im Folgenden versuchen wir herauszufinden, wie gross die Wahrscheinlichkeit ist, dass der Angreifer gewinnt und ein Dorf zerstören kann.
Nehmen wir zuerst einen einfachen Fall an: Der Angreifer hat einen Soldaten und der Verteidiger hat nur das Dorf mit einem Leben. Das heisst, beide erhalten einen Würfel.
- Der Angreifer gewinnt, wenn er eine höhere Zahl würfelt als der Verteidiger. Dann wird das Dorf zerstört und der Angreifer gewinnt.
- Der Verteidiger gewinnt, wenn er mindestens gleich hoch würfelt wie der Angreifer. Dann bleibt das Dorf stehen und der Angreifer verliert seinen Soldaten.
Versuchen Sie nun, die Wahrscheinlichkeit herauszufinden, dass der Angreifer gewinnt. Simulieren Sie dazu eine Million Würfe und zählen Sie, wie oft der Angreifer gewonnen hat.
Mögliche Lösungimport random versuche = 1_000_000 angreifer_gewinnt = 0 for _ in range(versuche): a = random.randint(1, 6) v = random.randint(1, 6) if a > v: angreifer_gewinnt += 1 print("Angreifer gewinnt:", angreifer_gewinnt, "Mal") print("Wahrscheinlichkeit:", angreifer_gewinnt/versuche)Mathematisch gibt es 36 Würfelkombinationen, davon gewinnt der Angreifer in 15 Fällen (). Der Verteidiger ist im Vorteil — Gleichstand zählt für ihn.
Aufgabe 5: Ein Spiel mit Würfeln simulieren (erweiterte Variante)
Nehmen wir nun an, dass der Angreifer zwei Soldaten hat und deswegen zwei Würfel werfen kann. Der Verteidiger hat aber immer noch nur ein Dorf mit einem Leben. Das heisst, der Angreifer würfelt zwei Würfel und der Verteidiger einen Würfel. Es wird jeweils der höchste Würfel des Angreifers mit dem Würfel des Verteidigers verglichen.
Wenn der Verteidiger einmal gewinnt, bleibt das Dorf stehen und der Angreifer verliert einen Soldaten. Der Angreifer kann die Angriffswelle aber mit nur einem Soldaten und nur noch einem Würfel weiterführen.
Versuchen Sie nun, die Wahrscheinlichkeit herauszufinden, dass der Angreifer gewinnt. Simulieren Sie dazu eine Million Angriffswellen und zählen Sie, wie oft der Angreifer gewonnen hat.
Mögliche Lösungimport random versuche = 1_000_000 angreifer_gewinnt = 0 for _ in range(versuche): # Erste Welle: Angreifer mit zwei Würfeln, Verteidiger mit einem a1 = random.randint(1, 6) a2 = random.randint(1, 6) a_max = max(a1, a2) v = random.randint(1, 6) if a_max > v: # Dorf zerstört, Angreifer gewinnt angreifer_gewinnt += 1 else: # Erste Welle verloren, Angreifer hat noch einen Soldaten a = random.randint(1, 6) v = random.randint(1, 6) if a > v: angreifer_gewinnt += 1 print("Angreifer gewinnt:", angreifer_gewinnt, "Mal") print("Wahrscheinlichkeit:", angreifer_gewinnt/versuche)Die zwei Würfel verbessern die Chance des Angreifers erheblich: von rund 42% (Aufgabe 4) auf rund 66%. Mit einer zweiten Chance bei verlorener erster Welle nähert sich die Gesamtwahrscheinlichkeit .
Aufgabe 6: Wie lange dauert es bis zu fünf Sechsern in Serie? 🧩
Stellen Sie sich vor, Sie würfeln so lange, bis Sie fünfmal hintereinander eine 6 würfeln. Sobald irgendwo eine andere Zahl als die 6 fällt, beginnt das Zählen der Serie von vorne. Wie viele Würfe brauchen Sie ungefähr?
Schreiben Sie ein Programm, das diesen Vorgang simuliert. Speichern Sie die Gesamtzahl der Würfe in einer Variable versuche.
Tipp: Sie brauchen eine while-Schleife, die läuft, solange Ihre aktuelle Serie noch nicht 5 erreicht hat. Führen Sie zwei Zähler mit: einen für die aktuelle Serie (die zurückgesetzt wird, sobald Sie keine 6 würfeln) und einen für die Gesamtzahl der Würfe.
Mögliche Lösungimport random serie = 0 versuche = 0 while serie < 5: if random.randint(1, 6) == 6: serie += 1 else: serie = 0 # Serie zurücksetzen! versuche += 1 print("Anzahl Würfe:", versuche)Mathematisch lässt sich der Erwartungswert berechnen als
Im Durchschnitt brauchen Sie also rund 9'330 Würfe, bis fünfmal hintereinander eine 6 fällt. Aber Achtung: Die Streuung ist riesig — manchmal sind Sie nach wenigen Hundert Würfen fertig, manchmal brauchen Sie über 50'000. Drücken Sie ein paarmal Run und beobachten Sie, wie stark die Zahl schwankt.Die Aufgabe ist auch ein schönes Beispiel dafür, warum die
while-Schleife hier perfekt passt: Wir wissen am Anfang gar nicht, wie viele Iterationen wir brauchen — einefor-Schleife mit fester Anzahl wäre völlig ungeeignet.