Python :: Aufgabe #106 :: Lösung #5

6 Lösungen Lösungen öffentlich
#106

Simulation des Monty-Hall-Problems

Anfänger - Python von hollst - 19.05.2016 um 13:44 Uhr
Das Monty-Hall-Problem ist eines der erstaunlichsten Paradoxa der Wahrscheinlichkeitsrechnung und ein sehr gutes Beispiel dafür, wie durch eine (teilweise bewusst) irreführende Fragestellung der Blick auf die Problemlösung verschleiert werden kann. Selbst gestandene Mathematiker sollen sich daran schon die Zähne ausgebissen und getäuscht haben, obwohl die Lösung doch recht einfach ist.

Das Problem: Beteiligt sind ein Kandidat, ein Moderator und drei verschlossene Container. In einem der drei Container befindet sich der Hauptgewinn, in den zwei anderen jeweils ein Trostpreis. Der Moderator, der weiss, in welchem Container sich der Hauptgewinn befindet, bittet den Kandidaten, den "Hauptgewinn-Container" zu erraten. Der Kandidat entscheidet sich bspw. für Container # 1. Daraufhin geht der Moderator zu einem anderen Container mit Trostpreisinhalt, öffnet diesen Container und bietet dem Kandidaten gleichzeitig an, seine Wahlentscheidung noch einmal zu überdenken und gegebenenfalls zu wechseln.

Wie soll sich der Kandidat entscheiden? Es ist klar, dass sich in einem der zwei noch verschlossenen Container der Hauptgewinn befindet, in welchem, ist nur mit einer Wahrscheinlichkeit von 50 % bekannt. Wir wollen nun von zwei unterschiedlichen Kandidatentypen ausgehen: Typ 1 (konventioneller Typ) sagt sich, bei einer 50 : 50 Chance ist es egal, ob man wechselt, aber die Erfahrung sagt ihm, dass oftmals der erste Gadanke der beste ist, also entscheidet sich Typ 1 für NICHT WECHSELN. Typ 2 (gutgläubiger Typ) denk sich, wenn der Moderator ihm schon die Chance zum Wechseln anbietet, sollte er diese wahrnehmen, denn der Moderator würde ihm sicher nichts nachteiliges anbieten, also entscheidet sich Typ 2 für WECHSELN.

Mit der Simulation soll statistisch bekräftigt werden, ob (a) WECHSELN vorteilhaft ist, (b) gar keinen Einfluss hat oder (c) sogar nachteilig wäre. Wer Lust hat, kann das Simulationsergebnis auch noch zu erklären versuchen.

Im Bild ist exemplarisch eine Gewinnverteilung für die zwei Kandidaten-Typen nach vier Spielversuchen (Simulationen) dargestellt. Vier Versuche sind allerdings zu wenig, um sich bereits eine Meinung bilden zu können.
#5
vote_ok
von 0 (0 Punkte) - 23.09.2017 um 12:59 Uhr
Quellcode ausblenden Python-Code
#Monty Hall Simulation
from tkinter import *
from random import randint,choice
def neu():
    zaehler.set(0)
    NW.set(0)
    W.set(0)
    wechsel.set(0)
    keinwechsel.set(0)
def press10():
    z=zaehler.get()
    z+=10
    nw=NW.get()
    w=W.get()
    for i in range(10):
        if versuch('konventionell'):
            nw+=1
        if versuch('unkonventionell'):
            w+=1
    NW.set(nw)
    W.set(w)
    nw=str(nw*100/z)+'%'
    w=str(w*100/z)+'%'
    keinwechsel.set(nw)
    wechsel.set(w)
    zaehler.set(z)
    
def press100():
    z=zaehler.get()
    z+=100
    nw=NW.get()
    w=W.get()
    for i in range(100):
        if versuch('konventionell'):
            nw+=1
        if versuch('unkonventionell'):
            w+=1
    NW.set(nw)
    W.set(w)
    nw=str(nw*100/z)+'%'
    w=str(w*100/z)+'%'
    keinwechsel.set(nw)
    wechsel.set(w)
    zaehler.set(z)
def press1000():
    z=zaehler.get()
    z+=1000
    nw=NW.get()
    w=W.get()
    for i in range(1000):
        if versuch('konventionell'):
            nw+=1
        if versuch('unkonventionell'):
            w+=1
    NW.set(nw)
    W.set(w)
    nw=str(nw*100/z)+'%'
    w=str(w*100/z)+'%'
    keinwechsel.set(nw)
    wechsel.set(w)
    zaehler.set(z)
def press1():
    z=zaehler.get()
    z+=1
    nw=NW.get()
    w=W.get()
    if versuch('konventionell'):
        nw+=1
    if versuch('unkonventionell'):
        w+=1
    NW.set(nw)
    W.set(w)
    nw=str(nw*100/z)+'%'
    w=str(w*100/z)+'%'
    keinwechsel.set(nw)
    wechsel.set(w)
    zaehler.set(z)
def versuch(art):
    tueren=['A','B','C']
    auto=choice(tueren)
    wahl=choice(tueren)
    if wahl==auto:
        if art=='konventionell':
            return True
        elif art=='unkonventionell':
            tueren.remove(auto)
            wahl=choice(tueren)
            if wahl==auto:
                return True
            else: return False
    else:
        if art=='konventionell':
            return False
        elif art=='unkonventionell':
            return True
fenster=Tk()
fenster.title('Monty Hall')
NW=IntVar()
W=IntVar()
zaehler=IntVar()
keinwechsel=StringVar()
wechsel=StringVar()
Label(fenster,text='Versuche: ').pack(anchor=E)
Label(fenster,textvariable=zaehler).pack(anchor=E)
f=Frame(fenster).pack(side=TOP)
Button(f,text='+1',command=press1).pack(anchor=N,side=LEFT)
Button(f,text='+10',command=press10).pack(anchor=N,side=LEFT)
Button(f,text='+100',command=press100).pack(anchor=N,side=LEFT)
Button(f,text='+1000',command=press1000).pack(anchor=N,side=LEFT)
Button(f,text='Neu',command=neu).pack(anchor=N,side=LEFT)
g=Frame(fenster).pack(side=RIGHT)
Label(g,text='Kein Wechsel:\nVersuche').pack(side=TOP)
Label(g,textvariable=NW).pack(anchor=CENTER)
Label(g,textvariable=keinwechsel).pack(anchor=CENTER)
Label(g,text='Wechsel:\nVersuche').pack(anchor=CENTER)

Label(g,textvariable=wechsel).pack(side=BOTTOM)
Label(g,textvariable=W).pack(side=BOTTOM)

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben