Kopf-oder-Zahl: Münz-Simulator programmieren (Python Tutorial)

Entscheidung nötig? Schmeiß eine Münze mit Python!

In diesem Tutorial lernst du, wie du einen Münzwurf simulieren kannst. Diese App ist hervorragend geeignet, wenn du bereits ein paar grundlegende Kenntnisse in Python hast und den nächsten Schritt zum fortgeschrittenen Python-Entwickler machen willst.

Auf den ersten Blick scheint die Münzwurf-Simulation ein einfaches Projekt zu sein. Während es sicherlich einfachere Lösungen gibt, zeige ich dir hier eine ausführlichere Version. Dadurch bekommst du einen Einblick, wie fortgeschrittene Programmierer arbeiten. Außerdem solltest du den nachfolgenden Code kritisch unter die Lupe nehmen, um dann selbst eine bessere und ggf. simplere Version nach zu programmieren.

Genug geredet. Lass uns mit der Münzwurf-App anfangen.

Was brauchst du alles für die App? Erstelle dir einen groben Plan

Bevor wir damit starten, ein Programm zu realisieren, sollten wir uns einen groben Fahrplan machen, wie die ungefähre Logik des Münzwurfes aussieht.

Auch wenn es sich hier um einen simplen Münzwurf handelt, hilft dir ein ungefährer Plan dabei den Fokus beim Programmieren zu behalten.

Okay. Was brauchen wir?

Wir wissen, dass wir einen fairen Münzwurf haben wollen. Eine Münze hat zwei Seiten, nämlich Kopf und Zahl. Wenn wir von „fair“ reden, wissen wir, dass die Münze entweder auf der Kopf- oder Zahl-Seite landen wird. Daraus können wir schlussfolgern, dass die Wahrscheinlichkeit bei 50% liegt, entweder Kopf oder Zahl zu bekommen.

Für die Experten unter euch: Wenn ihr es etwas komplexer haben wollt, könnt ihr auch mit gewichteten Münzen arbeiten oder mit einbeziehen, dass eine Münze in sehr seltenen Fällen, nach dem Münzwurf, auch auf dem Münzrand landen kann. Dementsprechend verändern sich dann die Wahrscheinlichkeiten, die ihr mit einprogrammieren müsst. Als Anfänger würde ich diesen Teil jedoch überspringen.

Binomialverteilung

Wie simuliert man eigentlich einen Münzwurf? Leider können wir dem Computer nicht sagen, dass er einfach mal eine Münze schmeißen soll. Wir benutzen für die Realisierung dieser App Python. Da Python von Hause aus Module für mathematische Operationen mitbringt, können wir die Wahrscheinlichkeitsrechnung benutzen.

In unserem Fall werden wir mit dem bekannten Modul "Numpy" arbeiten. Numpy wird häufig im Data-Science-Bereich eingesetzt. Wenn du Data-Scientist werden willst oder dich für Machine-Learning interessiert, ist dieses Tutorial ideal um die Basics zu lernen.

Die Binomialverteilung von Numpy lässt sich über folgenden Befehl nutzen:

Code-Beispiel: Binomialverteilung in Numpy

np.random.binomial(n, p)

Es handelt sich dabei um eine Methode in der Klasse random. Hier wird die Anzahl der Versuche (n) und die Wahrscheinlichkeit des Eintretens des Ereignisses (p) entgegengenommen.

Die Binomialverteilung kann, wie der Name schon sagt, einen "Münzwurf" von zwei Ereignissen durchführen. Der Aufruf gibt uns eine 0 oder 1 zurück, um eines der beiden Ereignisse zu repräsentieren.

Bitte nicht erschrecken. Hier ist die mathematische Gleichung für unseren Fall, als Referenz.

python numpy binomialverteilung formel

Einfache Erklärung der Gleichung:

  • p ist die Wahrscheinlichkeit,
  • n ist die Anzahl der durchgeführten Versuche und
  • N ist die Anzahl der Erfolge.

Daher wissen wir nun, dass wir für die Binomialverteilung zwei Variablen in unserem Programm brauchen, n und p.

Wir können jetzt selbst entscheiden, ob das Programm uns jeden Wurf anzeigen soll oder ob wir uns mit dem Ergebnis (0 oder 1) zufrieden geben.

Da ich neugierig bin, lassen wir uns ein Array von Ereignissen anzeigen.

Also brauchen wir ein Array, in dem wir die Ergebnisse abspeichern können. Numpy bringt auch diese Fähigkeiten bereits mit.

Nachfolgend kommen wir (endlich) zum Programmieren.

Quellcode des Münzwurfs

Die Umsetzung kann beginnen. Zunächst müssen wir numpy importieren.

import numpy as np

Wie zuvor beschrieben, erstellen wir nun die Variablen n und p.

Wir wissen, dass wir diese benötigen, da wir np.random.binomial benutzen wollen und die Methode die Anzahl der Versuche (n) und die Wahrscheinlichkeit (p) benötigt.

# Wahrscheinlichkeit Kopf oder Zahl. Kann geändert werden.
p = .5

# Die Anzahl der benötigten Würfe. Kann beliebig geändert werden.
n = 10

In meinem Code kommentiere ich lieber zu viel als zu wenig. Im obigen Code-Beispiel siehst du zwei Kommentare zu unseren beiden Variablen. Als Anfänger solltest du dir direkt angewöhnen, deinen Code ausführlich zu kommentieren.

Weiter geht’s.

Wir wissen, dass wir ein Array initiieren müssen, um die Würfe zu speichern. Durch die Verwendung von np.arange erstellen wir ein Array mit 10 Elementen. Das Array wird mit den Werten 0 bis 9 in aufsteigender Reihenfolge gefüllt.

# Array für Würfe initiieren
alleWürfe = np.arange(n)

Nachfolgend haben wir erneut zwei Entscheidungen.

Der Münzwurf kann in einer Funktion oder in einer for-Schleife gemacht werden.

Da wir den Code bestimmt in einem anderen Programm gut gebrauchen können (Stichwort: Wiederverwendbarkeit), erstellen wir eine Funktion, die unsere Binomialverteilung enthält.

Dadurch lässt sich das Programm auch zu einem späteren Zeitpunkt sehr gut weiterentwickeln.

Münzwerf-Funktion erstellen

Zeit, die Funktion zu erstellen.

Wir werden die Funktion münzWurf nennen. Die Funktion wird die Wahrscheinlichkeit der Ereignisse aufnehmen und das Ergebnis der Binomialrechnung zurückgeben. Achte darauf, dass du die Funktion vor den Variablen platzierst. Siehe nachfolgenden Code:

Funktion für Münzwurf erstellen

def münzWurf(p):

# Binomialverteilung ausführen (gibt 0 oder 1 zurück)
  ergebnis = np.random.binomial(1,p)

# Rückgabe des Wurfs, der zum Numpy Array hinzugefügt wird
  return ergebnis

Im o.g. Code siehst du, dass die Anzahl der Versuche auf 1 gesetzt wurde, was nur eine 0 oder 1, false oder true zurückgibt. Nun kann die for-Schleife erstellt werden, die unsere Funktion münzWurf aufruft.

For-Schleife

# Die gewünschte Anzahl von Flips mit der oben eingestellten Wahrscheinlichkeit durchführen

for i in range(0, n):
  alleWürfe[i] = münzWurf(p)
  i+=1

For-Schleifen sind grundlegende Kontrollstrukturen. Da sich dieses Tutorial vorwiegend an Anfänger richtet, schauen wir uns aber kurz an was sich im o.g. Code abspielt.

  • Das i in der ersten Zeile ist der Index, der steuert, ob die Schleife erneut ausgeführt wird oder nicht.
  • range(0,n) sind die Werte, die i enthalten kann.
  • Wir verwenden n, damit wir unsere Arraygröße nicht überschreiten.

Wenn das Programm in die Schleife einsteigen kann, wird die Funktion münzWurf, die wir zuvor erstellt haben, aufgerufen. Jetzt wird das Ergebnis in dem Element in unserem Array gespeichert. Der Index i, wird dann inkrementiert (+1 hochgezählt).

Ergebnisse des Münzwurfs ausgeben

Wir sind fast fertig. Der letzte Schritt wird sein, die Ergebnisse zu zählen und anzuzeigen.

Dieser Teil ist ganz einfach. Wir werden die Wahrscheinlichkeit ausgeben, die wir als Variablenwert definiert haben. Numpy hat viele verschiedene Funktionen, die auf Arrays ausgerichtet sind. Wir werden np.count_nonzero() verwenden, um durch das Array zu iterieren und die Anzahl der Vorkommen von 0 und 1 zählen

# Erklärung anzeigen
print("Wahrscheinlichkeit wurde gesetzt auf ", p)
print("Zahl = 0, Kopf = 1: ", alleWürfe)

# Kopf und Zahl zusammenzählen und anzeigen
print("Anzahl - Zahl: ", np.count_nonzero(alleWürfe == 1))
print("Anzahl - Kopf: ", np.count_nonzero(alleWürfe == 0))

Das war's! Wir haben ein Programm erstellt, das den Münzwurf einer fairen Münze simuliert

Hier der gesamte Quellcode:

import numpy as np

def münzWurf(p):

  # Binomialverteilung ausführen (gibt 0 oder 1 zurück) 
  ergebnis = np.random.binomial(1,p) 

  # Rückgabe des Wurfs, der zum Numpy Array hinzugefügt wird 
  return ergebnis

# Wahrscheinlichkeit Kopf oder Zahl. Kann geändert werden. 
p = .5 

# Die Anzahl der benötigten Würfe. Kann beliebig geändert werden. 
n = 10

# Array für Würfe initiieren
alleWürfe = np.arange(n)

for i in range(0, n):
  alleWürfe[i] = münzWurf(p)
  i+=1
  
# Erklärung anzeigen
print("Wahrscheinlichkeit wurde gesetzt auf ", p)
print("Zahl = 0, Kopf = 1: ", alleWürfe)

# Kopf und Zahl zusammenzählen und anzeigen
print("Anzahl - Zahl: ", np.count_nonzero(alleWürfe == 1))
print("Anzahl - Kopf: ", np.count_nonzero(alleWürfe == 0))

 

War doch relativ einfach, oder? Einfache Python-Projekte wie diese zu bewältigen ist ein guter Weg sich mit den Python-Grundlagen sowie dem Numpy-Modul vertraut zu machen.

Numpy ist eine mächtige Bibliothek und kann viel mehr, als nur einen Münzwurf zu simulieren. Wenn du daran interessiert bist, mehr zu lernen, schau dir unsere Python Tutorials oder Python Online-Kurse (z.B. Bootcamp) an.

  • 9. Dezember 2021
Click Here to Leave a Comment Below 0 comments

Leave a Reply: