Simula il problema di Monty Hall usando Python
Controlla i risultati simulati di questo sconcertante test di gioco per dimostrare a te stesso che cambiare idea, a volte, paga davvero.
Se sei un ragazzino degli anni '70, potresti essere cresciuto guardando il popolare programma televisivo Let's Make a Deal. Da allora, le persone discutono vivacemente del puzzle di Monty Hall e si divertono a replicarlo. La suspense e il dramma sbalorditivi creati quando il concorrente sceglie una delle tre porte sono divertenti da guardare ogni volta.
Utilizzando la matematica e un po' di programmazione, costruirai un simulatore di Monty Hall utilizzando Python. Usando questo, potrai decidere una volta per tutte che cambiare le porte aumenta le tue possibilità di vincita.
Qual è il problema di Monty Hall?
Il problema di Monty Hall è un rompicapo che prende il nome dal conduttore del gameshow, Monty Hall. Ci sono tre porte, solo una delle quali contiene il premio desiderato. Una volta scelta una porta, Monty, chissà cosa c'è dietro, apre un'altra porta, rivelando una capra. Ora hai la possibilità di mantenere la tua decisione originale o passare all'altra porta.
Grazie alla sua natura sorprendente e imprevedibile, il puzzle Monty Hall è molto popolare. Sebbene si tratti di probabilità, la soluzione sfida l’intuizione. Serve come un'eccellente dimostrazione di quanto possano essere confusi i calcoli delle probabilità. Il puzzle ci insegna come ignorare le impressioni di eventi apparentemente casuali e concentrarci invece sul ragionamento e sui fatti.
I moduli Random e Tkinter
Per costruire una simulazione di Monty Hall in Python, inizia con i moduli Random e Tkinter.
Ci sono diverse funzioni per produrre numeri casuali nel modulo Random. Puoi utilizzare questi algoritmi per generare sequenze mescolate, movimenti di gioco e numeri interi pseudo-casuali. Viene spesso utilizzato in giochi come il cricket manuale o un semplice test di battitura, nonché per simulare il lancio dei dadi e per mescolare elenchi.
Tkinter è la libreria GUI predefinita per Python. Usandolo, puoi creare fantastiche applicazioni GUI. Potresti creare un'app per l'elenco delle cose da fare, un editor di testo o una semplice calcolatrice. Puoi mettere in pratica le tue conoscenze e affinare le tue capacità di programmazione utilizzando Python e Tkinter per creare app desktop di base.
Apri un terminale ed esegui il seguente comando per aggiungere Tkinter al tuo sistema:
pip install tkinter
Come costruire un simulatore di Monty Hall usando Python
Puoi trovare il codice sorgente del Monty Hall Simulator in questo repository GitHub.
Importa i moduli random e Tkinter. La funzione StringVar semplifica il controllo del valore di un widget come un'etichetta o una voce. È possibile utilizzare un'etichetta per visualizzare del testo sullo schermo e una voce per recuperare l'input dell'utente.
Inizializza l'istanza di Tkinter e visualizza la finestra root. Imposta le dimensioni della finestra su 600 pixel di larghezza e 200 pixel di altezza utilizzando il metodo geometry(). Imposta un titolo appropriato per la finestra e vietane il ridimensionamento.
import random
from tkinter import StringVar, Label, Tk, Entry
window = Tk()
window.geometry("600x200")
window.title("Monty Hall Simulation")
window.resizable(0, 0)
Successivamente, imposta due coppie di widget e variabili per memorizzare i risultati della simulazione. L'app richiederà il completamento di un numero di esecuzioni. Durante ogni esecuzione simulerà il gioco e registrerà il risultato caso per caso: se il giocatore decide di cambiare o mantenere la stessa scelta.
Usando StringVar(), imposta i valori iniziali della stessa scelta e della scelta cambiata su 0. Definisci un widget Entry e imposta la sua dimensione del carattere su 5. Dichiara due etichette per visualizzare la stessa scelta e la scelta cambiata e posizionala. Dichiara altre due etichette che visualizzeranno il valore delle variabili definite in precedenza. Infine, posiziona il widget Entry sotto queste quattro etichette.
same_choice = StringVar()
switched_choice = StringVar()
same_choice.set(0)
switched_choice.set(0)
no_sample = Entry(font=5)
Label(text="Same Choice").place(x=230, y=58)
Label(text="Switched Choice").place(x=230, y=90)
Label(textvariable=same_choice, font=(50)).place(x=350, y=58)
Label(textvariable=switched_choice, font=(50)).place(x=350, y=90)
no_sample.place(x=200, y=120)
Definire una funzione, simulare. Inizializza le variabili dei risultati e ottieni il valore del campione immesso dall'utente. Dichiara un elenco che contiene gli elementi che le porte riveleranno.
All'interno di ogni sequenza, crea un elenco duplicato delle porte originali e mescolalo in ordine casuale. Scegli una porta a caso e rimuovila: questo simula la scelta del giocatore. Poi simula la rivelazione di Monty: se la prima porta non contiene il premio, aprila, altrimenti apri la seconda porta. Rimuovi quella scelta e lascia la porta rimanente come opzione a cui passare.
def simulate(event):
same_choice_result = 0
switched_choice_result = 0
samples = int(no_sample.get())
doors = ["gold", "goat", "goat"]
for _ in range(samples):
simulated_doors = doors.copy()
random.shuffle(simulated_doors)
first_choice = random.choice(simulated_doors)
simulated_doors.remove(first_choice)
opened_door = simulated_doors[0] if simulated_doors[0] != "gold" else simulated_doors[1]
simulated_doors.remove(opened_door)
switched_second_choice = simulated_doors[0]
Se la prima scelta contiene il premio desiderato, incrementa il risultato della stessa scelta di uno e riflettelo sullo schermo. Altrimenti eseguire la stessa operazione per la scelta commutata.
if first_choice == "gold":
same_choice_result += 1
same_choice.set(same_choice_result)
elif switched_second_choice == "gold":
switched_choice_result += 1
switched_choice.set(switched_choice_result)
Un passaggio importante è associare il tasto Invio a un evento nella finestra di Tkinter. In questo modo si garantisce che quando il giocatore preme Invio, verrà eseguita una particolare funzione. Per ottenere ciò, passa la stringa
La funzione mainloop() dice a Python di eseguire il ciclo di eventi di Tkinter e di ascoltare gli eventi (come la pressione di pulsanti) finché non chiudi la finestra.
no_sample.bind("<Return>", simulate)
window.mainloop()
Metti tutto insieme ed esegui il tuo programma per simulare il puzzle in azione.
Output del simulatore di Monty Hall utilizzando Python
Durante l'esecuzione del programma, vedrai una semplice finestra con le etichette di scelta Stesso e Cambiato. Inserisci un numero di campione nel campo in basso per visualizzare i risultati simulati. In questo esempio di 3 esecuzioni, il programma mostra che vince una volta con la stessa scelta e due volte con un cambio.
Questi risultati sono casuali, ma è possibile eseguire la simulazione con una dimensione del campione maggiore per una maggiore precisione. Nel seguente campione di 100, la scelta scambiata vince 65 volte.
Risoluzione dei problemi utilizzando la programmazione
Il Monty Hall Simulator è un'eccellente dimostrazione di come è possibile utilizzare la programmazione per risolvere problemi della vita reale. Puoi sviluppare vari algoritmi e addestrare modelli per svolgere compiti particolari come ordinare un array o migliorare l'efficacia di un sistema per una produzione ottimale.
Diversi linguaggi di programmazione offrono diverse capacità e funzioni per semplificare la programmazione. Utilizzando Python, puoi creare modelli in grado di prevedere i valori futuri di un set di dati con maggiore precisione. Inoltre, puoi automatizzare le operazioni ripetitive, ridurre il lavoro noioso e migliorare la velocità e la precisione.