Monte Carlo szimulációk Pythonban II. – A Monty Hall paradoxon5 perc olvasás

Ma a Monty Hall paradoxonnal fogunk foglalkozni. Ez a valószínűségi paradoxon sokak számára ismerős lehet. Az amerikai Let’s Make a Deal című televíziós vetélkedő műsorvezetőjéről, Monty Hall-ról kapta a nevét. A vetélkedőben a játékosnak mutatnak három csukott ajtót, amelyek közül kettő mögött egy-egy kecske van, a harmadik mögött pedig egy új autó. A játékos nyereménye az általa kiválasztott ajtó mögött van. Először a játékos csak rámutat az egyik ajtóra, de mielőtt valóban kinyitná, a műsorvezető a másik két ajtó közül kinyit egyet, amelyik mögött egy kecske van (a játékvezető tudja, melyik ajtó mögött mi van), majd megkérdezi a játékost, hogy akar-e módosítani a választásán. A nagy kérdés, hogy érdemes-e változtatni a játékosnak a választásán.

Sokan elsőre azt gondolnák, hogy mindegy, hogy váltunk-e. Azonban aki hallott már erről a paradoxonról tudja, hogy ez nem igaz. Érdemes váltani, hiszen ezzel megduplázzuk a nyerési valószínűségünket. Ez ellentmond az intuíciónknak, de a Bayes-tétel segítségével megmutathatjuk, hogy valóban érdemes váltani.

Először is elevenítsük fel a Bayes-tétel képletét:

Image result for bayes theorem

A szemléltetés kedvéért tegyük fel, hogy először az 1-es számú ajtót választjuk, és a 2-es számút nyitják ki. Jelöljük H-val azt az ajtót, amit Monty Hall kinyit, és C-vel azt, amelyik mögött a kocsi van. Tudjuk, hogy P(C=1)=P(C=2)=P(C=3)=1/3. Ez a prior valószínűség, azaz a kocsit rejtő ajtó kiválasztásának a valószínűsége akkor, ha semmi plusz információnk nincs.

Azonban az egyik ajtót kinyitják nekünk, ezzel plusz információra teszünk szert. Nézzük meg például, hogy mit tudunk meg, ha a második ajtót nyitják ki. Tudjuk, hogy Monty Hall egy kecskét akar nekünk mutatni. Ha a második ajtó mögött van az autó, akkor nem azt fogja kinyitni.

Ha azt az ajtót választottuk az elsőre, ami mögött az autó van, akkor Monty a maradék két ajtó közül bármelyiket megmutathatja nekünk. Tehát annak a valószínűsége, hogy a második ajtót nyitja ki, ha az első ajtó mögött van a kocsi, 1/2.

Ellenkező esetben a játékvezető csak egy ajtót mutathat, azt amelyiket nem választottuk és nincs is mögötte autó. 

Ezeket az értékeket már csak be kell helyettesítenünk a Bayes-tételbe ahhoz, hogy megkapjuk annak a valószínűségét, hogy a harmadik ajtó mögött van az autó, ha a másodikat nyitották ki.

 Tehát a második ajtó kinyitása után ha megváltoztatjuk az eredeti választásunkat (első ajtóról a harmadikra), akkor 2/3 esélyünk van az autó megnyerésére. Ha nem váltunk, akkor természetesen marad az eredeti 1/3:

A probléma szimmetrikus, ezért nem számít, hogy először melyik ajtót választottuk, és hogy melyik mögött van az autó. Minden esetben érdemes váltani.

A levezetések és különböző bizonyítások ellenére sokan nehezen tudják elfogadni, hogy a váltás a helyes stratégia. Erdős Pál, az egyik leghíresebb magyar matematikus állítólag egészen addig nem volt meggyőzve, amíg nem mutattak neki egy számítógépes szimulációt. Egy ilyen szimulációt Pythonban pár sor kóddal meg tudunk oldani. Nézzünk erre egy példát:

import random

n_wins=0
samples=10000
changeDoors=True
for i in range(samples):
    prizes=["goat","goat","car"]
    random.shuffle(prizes)
    
#Véletlenszerűen választunk egy ajtót(azaz egy index-et amivel kijelöljük az egyik elemet a prizes listából)    
    firstChoice=random.randint(0,2)
    
    
#A játékvezető tudja, hogy melyik ajtó mögött van kecske és melyik mögött autó:
    goat_indices=[i for i, x in enumerate(prizes) if x == "goat"]
    car_index=prizes.index("car")
    
    
#Ha azt az ajtót választottuk, ami mögött az autó van, akkor a játékvezető véletlenszerűen kinyit egyet a maradék két ajtó közül   
    if car_index==firstChoice:
        door_to_show=goat_indices[random.randint(0,1)]
        prizes[door_to_show]="-"
        
#Ha nem, akkor a játékvezető azt az ajtót, ami mögött kecske van, de nem választottuk ki
    else:
        goat_indices.remove(firstChoice)
        door_to_show=goat_indices[0]
        prizes[door_to_show]="-"
    
#Majd megkérdezi a játékost, hogy változtat-e.
    if changeDoors is True:       
        secondChoice=[int(x) for x in set([0,1,2])-set([firstChoice])-set([door_to_show])][0]
        if prizes[secondChoice]=="car":
            n_wins+=1
        
    else:
        secondChoice=firstChoice
    
        if prizes[secondChoice]=="car":
            n_wins+=1

proportion=float(n_wins)/samples*100

A changeDoors változó True vagy False értékének változtatásával tudjuk módósítani a váltási stratégiát. 10000 szimuláció lefuttatása után a változtatós stratégiával elért eredmény 67,15% volt, változtatás nélkül pedig 32,89%. Ezek jól közelítik az elméleti értékeket, remélhetőleg Erdős Pált is meggyőznék.

Leave a Reply

Your email address will not be published. Required fields are marked *