Das folgende Programm simuliert das Ziegenproblem bzw. genauer das “Monty-Hall-Standard-Problem” (siehe Abschnitt Weiteres).
Ziegenproblem-Simulationsprogramm (relativ kurze Version)
Ziegenproblem-Simulationsprogramm (relativ kurze Version)
- simulation-ziegenproblem-kurz.py
from random import *
ANZAHL_SIMULATIONEN = 1000000
anzahl_gewinne_bei_wechselstrategie = 0
anzahl_gewinne_bei_verbleibstrategie = 0
for simulationsnummer in range(ANZAHL_SIMULATIONEN):
auto = randrange(1, 4)
kandidat = randrange(1, 4)
if kandidat == auto:
anzahl_gewinne_bei_verbleibstrategie = anzahl_gewinne_bei_verbleibstrategie + 1
else:
anzahl_gewinne_bei_wechselstrategie = anzahl_gewinne_bei_wechselstrategie + 1
print(f'Relative Anzahl der Gewinne bei Wechselstrategie: {100 * anzahl_gewinne_bei_wechselstrategie / ANZAHL_SIMULATIONEN:.4f} %')
print(f'Relative Anzahl der Gewinne bei Verbleibstrategie: {100 * anzahl_gewinne_bei_verbleibstrategie / ANZAHL_SIMULATIONEN:.4f} %')
Noch weiter verkürzte Version
Noch weiter verkürzte Version
Wenn man zum Beispiel nur die Verbleibstrategie betrachtet, spart man 3 Codezeilen. Dann braucht man die Variablen auto
und kandidat
eigentlich gar nicht: Nochmal 2 Codezeilen gespart.
- simulation-ziegenproblem-sehr-kurz.py
from random import *
ANZAHL_SIMULATIONEN = 1000000
anzahl_gewinne_bei_verbleibstrategie = 0
for simulationsnummer in range(ANZAHL_SIMULATIONEN):
if randrange(1, 4) == randrange(1, 4):
anzahl_gewinne_bei_verbleibstrategie = anzahl_gewinne_bei_verbleibstrategie + 1
print(f'Relative Anzahl der Gewinne bei Wechselstrategie: {100 * (ANZAHL_SIMULATIONEN - anzahl_gewinne_bei_verbleibstrategie) / ANZAHL_SIMULATIONEN:.4f} %')
print(f'Relative Anzahl der Gewinne bei Verbleibstrategie: {100 * anzahl_gewinne_bei_verbleibstrategie / ANZAHL_SIMULATIONEN:.4f} %')
Ziegenproblem-Simulationsprogramm mit Kommentaren und ausführlicher Ausgabe
Ziegenproblem-Simulationsprogramm mit Kommentaren und ausführlicher Ausgabe
- simulation-ziegenproblem.py
from random import *
ANZAHL_SIMULATIONEN = 1000000
# Man mag sich vorstellen, dass zwei Personen spielen.
# Die eine Person spielt mit der Wechselstrategie,
# d.h. sie wechselt stets zur anderen Tür, nachdem der
# Showmaster eine Tür geöffnet hat. Sie zählt die Anzahl ihrer
# Gewinne in der folgenden Variablen.
anzahl_gewinne_bei_wechselstrategie = 0
# Die andere Person bleibt stets bei der Tür, die sie
# zuerst gewählt hat. Sie zählt die Anzahl ihrer Gewinne
# in der folgenden Variablen.
#
# Falls sich jemand wundert, warum wir diese beiden Strategien in
# derselben Simulation gleichzeitig testen können:
# Da die Wahl der ersten Tür zufällig geschieht, können wir einfach annehmen,
# dass beide Personen dieselbe Tür wählen.
anzahl_gewinne_bei_verbleibstrategie = 0
for simulationsnummer in range(ANZAHL_SIMULATIONEN):
if simulationsnummer % 100000 == 0:
print(f'Simulation: {simulationsnummer}')
# Ermittle die Nummer der Tür, hinter der das Auto steht,
# also 1, 2 oder 3, jeweils mit Wahrscheinlichkeit 1/3.
auto = randrange(1, 4)
# Zufällige Wahl der Türnummer durch den Kandidaten.
# (Wer mag, kann auch den Kandidaten stets Tür Nummer 3 wählen lassen.)
kandidat = randrange(1, 4)
if kandidat == auto:
# Das Auto befindet sich hinter der vom Kandidaten gewählten Tür.
# Der Showmaster öffnet zufällig eine der beiden anderen Türen,
# hinter denen sich jeweils eine Ziege befindet.
# Bleiben führt zum Gewinn des Autos, Türwechsel zur Ziege.
anzahl_gewinne_bei_verbleibstrategie = anzahl_gewinne_bei_verbleibstrategie + 1
else:
# Das Auto befindet sich nicht hinter der vom Kandidaten gewählten Tür.
# Der Showmaster muss die vom Kandidaten nicht gewählte Tür öffnen,
# hinter der sich die Ziege befindet.
# Türwechsel führt zu Auto, Bleiben zu Ziege.
anzahl_gewinne_bei_wechselstrategie = anzahl_gewinne_bei_wechselstrategie + 1
print(f'\nAnzahl der Simulationen: {ANZAHL_SIMULATIONEN}\n')
print(f'Anzahl der Gewinne bei Wechselstrategie: {anzahl_gewinne_bei_wechselstrategie}')
print(f'Anzahl der Gewinne bei Verbleibstrategie: {anzahl_gewinne_bei_verbleibstrategie}\n')
print(f'Relative Anzahl der Gewinne bei Wechselstrategie: {100 * anzahl_gewinne_bei_wechselstrategie/ANZAHL_SIMULATIONEN:.4f} %')
print(f'Relative Anzahl der Gewinne bei Verbleibstrategie: {100 * anzahl_gewinne_bei_verbleibstrategie/ANZAHL_SIMULATIONEN:.4f} %\n')
# Wer eine im Schweizer Stil formatierte Ausgabe möchte, verwende die folgenden Zeilen:
# print(f'\nAnzahl der Simulationen: {ANZAHL_SIMULATIONEN:,}\n'.replace(',', "'"))
# print(f'Anzahl der Gewinne bei Wechselstrategie: {anzahl_gewinne_bei_wechselstrategie:,}'.replace(',', "'"))
# print(f'Anzahl der Gewinne bei Verbleibstrategie: {anzahl_gewinne_bei_verbleibstrategie:,}\n'.replace(',', "'"))
# print(f'Relative Anzahl der Gewinne bei Wechselstrategie: {100 * anzahl_gewinne_bei_wechselstrategie/ANZAHL_SIMULATIONEN:.4f} %')
# print(f'Relative Anzahl der Gewinne bei Verbleibstrategie: {100 * anzahl_gewinne_bei_verbleibstrategie/ANZAHL_SIMULATIONEN:.4f} %\n')
Zusammengefasst führt das Schreiben des Programms (d.h. ein genaues Überlegen der Abläufe) sofort zur Lösung des Problems.