WPROWADZENIE
Paradoks Monty’ego Halla to interesujący problem matematyczny, który często budzi zaskoczenie. Jego nazwa pochodzi od amerykańskiego programu telewizyjnego Let’s Make a Deal, prowadzonego przez Monty’ego Halla. W Polsce problem ten można przyrównać do teleturnieju Idź na całość, prowadzonego przez Zygmunta Chajzera w latach 90., w którym gracze wybierali jedną z trzech bramek – za jedną kryła się główna nagroda, a w jednej z pozostałych był kot w worku – „Zonk”.
W klasycznym problemie Monty’ego Halla zasady są następujące:
- Gracz wybiera jedną z trzech bramek.
- Prowadzący, który zna położenie nagrody, otwiera jedną z pozostałych bramek, za którą kryje się jedna z dwóch nagród.
- Gracz ma możliwość zmiany swojego pierwotnego wyboru na drugą pozostałą, jeszcze zamkniętą bramkę.
Paradoks polega na tym, że intuicyjnie wielu osobom wydaje się, że zmiana wyboru nie wpływa na szanse wygranej – uważa się, że prawdopodobieństwo sukcesu jest równe 50%, skoro zostały już tylko dwie bramki. Jednak matematycznie udowodniono, że zmiana bramki podwaja szansę wygranej z 1/3 do 2/3. Wynika to z faktu, że początkowy wybór ma jedynie 1/3 szans na trafienie nagrody, a po odrzuceniu jednej pustej bramki przez prowadzącego, szanse przechodzą na drugą bramkę, jeśli gracz zdecyduje się na zmianę.
Poniżej przedstawiam program, który pokazuje, jak zmiana wcześniej wybranej bramki wpływa na zwiększenie prawdopodobieństwa wygranej.
Po uruchomieniu programu można przeprowadzić wiele symulacji, by zaobserwować, że prawdopodobieństwo wygranej po zmianie bramki rzeczywiście wynosi około 66%. To prosty, ale fascynujący przykład na to, jak paradoksalnie potrafią działać prawdopodobieństwa w sytuacjach, które na pierwszy rzut oka wydają się oczywiste.
KOD W JĘZYKU PYTHON
import random
import pandas as pd
liczba_gier = int(input("Podaj liczbę gier: "))
dane = []
for i in range(liczba_gier):
bramka_z_nagroda = random.choice([1, 2, 3])
wybor_uzytkownika = random.choice([1, 2, 3])
mozliwe_bramki_odrzucone = [x for x in [1, 2, 3] if x != wybor_uzytkownika and x != bramka_z_nagroda]
bramka_odrzucona = random.choice(mozliwe_bramki_odrzucone)
pozostale_bramki = [x for x in [1, 2, 3] if x != bramka_odrzucona and x != wybor_uzytkownika]
zmiana_wyboru = 1
ostateczny_wybor = wybor_uzytkownika if zmiana_wyboru == 0 else pozostale_bramki[0]
wygrana = 1 if ostateczny_wybor == bramka_z_nagroda else 0
if zmiana_wyboru==1:
zmiana_wyboru="TAK"
dane.append([i + 1, bramka_z_nagroda, wybor_uzytkownika, bramka_odrzucona, pozostale_bramki, zmiana_wyboru, ostateczny_wybor, wygrana])
df = pd.DataFrame(dane, columns=["Numer gry", "Bramka z nagrodą", "Wybór użytkownika", "Bramka odrzucona", "Pozostałe bramki", "Zmiana wyboru", "Ostateczny wybór", "Wygrana"])
pd.options.display.float_format = '{:.0f}'.format
display(df)
print (f"Liczba wygranych: {df['Wygrana'].sum()}")
print (f"Szansa wygrania po zmianie bramki: {df['Wygrana'].sum() *100 // liczba_gier} %")
⬆️⬆️⬆️ Zobacz w Google Colaboratory
JAK DZIAŁA PROGRAM?
- Import bibliotek:
- Pobranie liczby gier:
- Program prosi użytkownika o podanie liczby gier do symulacji.
- Główna pętla:
- Program wykonuje pętlę tyle razy, ile gier zostało podanych przez użytkownika.
- W każdej iteracji pętli symuluje pojedynczą grę w Monty Hall problem.
- Symulacja gry:
- Losowo wybiera bramkę z nagrodą (1, 2 lub 3).
- Losowo wybiera bramkę, którą początkowo wybierze użytkownik (1, 2 lub 3).
- Losowo wybiera bramkę do odrzucenia (musi to być bramka bez nagrody i inna niż wybrana przez użytkownika).
- Określa, która bramka pozostała (inna niż odrzucona i wybrana przez użytkownika).
- Symuluje zmianę wyboru użytkownika na pozostałą bramkę.
- Sprawdza, czy użytkownik wygrał (czy ostateczny wybór to bramka z nagrodą).
- Zapis danych:
- Dane z każdej gry (numer gry, bramka z nagrodą, wybór użytkownika, bramka odrzucona, pozostałe bramki, zmiana wyboru, ostateczny wybór, wygrana) są zapisywane do listy
dane
.
- Dane z każdej gry (numer gry, bramka z nagrodą, wybór użytkownika, bramka odrzucona, pozostałe bramki, zmiana wyboru, ostateczny wybór, wygrana) są zapisywane do listy
- Tworzenie DataFrame:
- Lista
dane
jest przekształcana do DataFrame za pomocą bibliotekipandas
. DataFrame to struktura danych, która pozwala na wygodne przechowywanie i analizowanie danych w formie tabeli.
- Lista
- Wyświetlenie DataFrame:
- DataFrame jest wyświetlany na ekranie.
- Wyświetlenie wyników:
Dodaj komentarz