mitmario.dev

Zufall

Python Sandbox 3 Min Lesezeit 4 BeispieleLektion 2 von 7

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

Fünfmal würfeln
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

Losen aus einer Liste
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

Eine Liste mischen
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

Derselbe Startwert
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, kostenlos

Zu 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.