Abschnitt 10 · Lektion 2
Zufall
Bei denselben Daten macht ein Programm immer dasselbe, und meistens ist das ja auch der Sinn. Beim
Zahlenraten aus Lektion 4.6 war das aber ein Problem. Die Geheimzahl stand als 37 fest im Code.
Wer das Spiel einmal gespielt hatte, kannte sie. Für ein Spiel, eine Auslosung oder einen Würfel
braucht es etwas, das man vorher nicht weiß, und dafür gibt es das Modul random (zufällig).
Würfeln mit randint
import random
for wurf in range(5):
print(random.randint(1, 6)) random.randint(1, 6) gibt eine ganze Zahl von 1 bis 6 zurück, bei jedem Aufruf eine neue. Wenn du
das Beispiel ein paar Mal laufen lässt, bekommst du jedes Mal andere Würfe.
Anders als bei range(1, 6) gehört die zweite Zahl hier dazu. Die 6 kann also fallen. Weil die
beiden Aufrufe so ähnlich aussehen, verwechselt man das leicht, und der Fehler fällt nicht auf. Ein
Würfel, der nie eine 6 würfelt, sieht beim ersten Hinsehen aus wie ein Würfel mit Pech.
Im Zahlenraten wird aus geheim = 37 damit geheim = random.randint(1, 100), und erst so wird es
ein Spiel. Die Tipps aus eingabe.txt treffen dann allerdings nicht mehr, weil man für eine Zahl,
die man nicht kennt, auch keine Tipps vorher aufschreiben kann.
Aus einer Liste losen
import random
namen = ["Mia", "Ole", "Aylin", "Karl", "Lena"]
print("Heute spült:", random.choice(namen))
print("Gewonnen haben:", random.sample(namen, 3)) random.choice(namen) zieht einen Eintrag aus einer Liste, hier den Namen für den Abwasch.
random.sample(namen, 3) zieht drei auf einmal, wie bei einer Tombola. Heraus kommt eine neue
Liste, in der kein Name zweimal steht. Ein gezogenes Los kommt ja auch nicht zurück in die Trommel.
Rufst du dagegen dreimal hintereinander choice auf, kann dreimal dieselbe Person drankommen.
Mischen mit shuffle
import random
vortraege = ["Mia", "Ole", "Aylin", "Karl"]
reihenfolge = random.shuffle(vortraege)
print(reihenfolge)
print(vortraege) Die Reihenfolge für vier Vorträge soll ausgelost werden. random.shuffle(vortraege) mischt die
Liste, aber anders, als man denkt. Gemischt wird die Liste selbst, und zurück kommt nichts. In
reihenfolge steht deshalb None, und gemischt ist vortraege. Das ist dieselbe Sache wie bei
sort() und sorted() aus Lektion 5.4. Nur gibt es zu shuffle kein shuffled.
Spätestens wenn man mit dem None weiterarbeitet, fällt der Fehler auf. reihenfolge[0] endet mit
TypeError: 'NoneType' object is not subscriptable, also „None kann man nicht über eine Position
lesen“.
Wenn du eine gemischte Kopie willst und die Liste so behalten möchtest, wie sie war, gibt es
random.sample(vortraege, len(vortraege)). Damit bekommst du alle Namen in zufälliger Reihenfolge
als neue Liste.
Derselbe Zufall noch einmal
import random
random.seed(2026)
print(random.randint(1, 100), random.randint(1, 100), random.randint(1, 100))
random.seed(2026)
print(random.randint(1, 100), random.randint(1, 100), random.randint(1, 100)) Echter Zufall ist das alles nicht. Ein Computer kann nicht würfeln, er kann nur rechnen. random
rechnet aus einem Startwert eine lange Folge von Zahlen aus, und zwar so geschickt, dass niemand
darin ein Muster findet. Weil sich random den Startwert beim Import vom Betriebssystem holt, jedes
Mal einen anderen, kommt bei jedem Lauf etwas anderes heraus.
Mit random.seed(2026) (seed, das Saatkorn) legst du den Startwert selbst fest. Dann kommt bei
jedem Lauf und auf jedem Rechner dieselbe Folge heraus, hier 16 41 65, zweimal hintereinander. Das
klingt nach einem Trick, der den Zufall kaputt macht. Für ein Spiel wäre es das auch.
Fürs Prüfen ist es aber die Grundlage. Wenn ein Programm bei jedem Lauf etwas anderes ausgibt, kann man es mit keinem festen Ergebnis vergleichen. Mit einem festen Startwert geht das. Und wenn ein Fehler nur bei einer bestimmten Auslosung auftritt, holt man genau diese Auslosung mit demselben Startwert so oft zurück, wie man will. Ins fertige Programm gehört der Startwert nicht, nur in seine Prüfung.
Was die Aufgabe will
Im Verein wird gewichtelt. Jeder beschenkt jemand anderen, und wer wen beschenkt, entscheidet das
Los. Die Funktion wichteln lost im Moment noch so aus, dass sich manche selbst beschenken und
andere gleich mehrere Geschenke bekommen. Richtig gelost bekommt jeder genau ein Geschenk von jemand
anderem. Geprüft wird mit vielen Startwerten, weil es hier kein festes Ergebnis gibt.
Zum Mitnehmen
Mit dem Modul random wird gewürfelt (randint), aus einer Liste gelost (choice, sample) und gemischt (shuffle). Dabei mischt shuffle die Liste selbst und liefert None. Setzt man vorher random.seed(…), kommt bei jedem Lauf dieselbe Folge heraus, und erst dann lässt sich ein Programm mit Zufall prüfen.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 4 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.