Simule o problema de Monty Hall usando Python
Verifique os resultados simulados deste teste de gameshow desconcertante para provar a si mesmo que realmente vale a pena mudar de ideia - às vezes.
Se você é um garoto dos anos 70, pode ter crescido assistindo ao popular game show Let's Make a Deal. Desde então, as pessoas discutem vividamente o quebra-cabeça de Monty Hall e se divertem reproduzindo-o. O suspense e o drama alucinantes criados quando o competidor escolhe uma das três portas são sempre divertidos de assistir.
Usando matemática e um pouco de programação, você construirá um Simulador Monty Hall usando Python. Com isso, você poderá decidir de uma vez por todas que trocar as portas aumenta suas chances de ganhar.
Qual é o problema de Monty Hall?
O problema de Monty Hall é um quebra-cabeças que leva o nome do apresentador do game show, Monty Hall. Existem três portas, das quais apenas uma contém o prêmio desejado. Depois de escolher uma porta, Monty – que sabe o que está atrás dela – abre outra porta, revelando uma cabra. Agora você tem a opção de manter sua decisão original ou mudar para a outra porta.
Devido à sua natureza surpreendente e imprevisível, o quebra-cabeça de Monty Hall é muito popular. Embora trate de probabilidades, a solução desafia a intuição. Serve como uma excelente demonstração de como os cálculos de probabilidade podem ser confusos. O quebra-cabeça nos ensina como ignorar as impressões de acontecimentos aparentemente aleatórios e, em vez disso, focar no raciocínio e nos fatos.
Os Módulos Random e Tkinter
Para construir uma simulação de Monty Hall em Python, comece com os módulos Random e Tkinter.
Existem várias funções para produzir números aleatórios no módulo Random. Você pode usar esses algoritmos para gerar sequências embaralhadas, movimentos de jogo e números inteiros pseudo-aleatórios. É frequentemente usado em jogos como críquete manual ou um simples teste de digitação, bem como para simular lançamentos de dados e embaralhar listas.
Tkinter é a biblioteca GUI padrão para Python. Usando-o, você pode criar aplicativos GUI fantásticos. Você pode criar um aplicativo de lista de tarefas, um editor de texto ou uma calculadora simples. Você pode colocar seu conhecimento em prática e aprimorar suas habilidades de programação usando Python e Tkinter para construir aplicativos de desktop básicos.
Abra um terminal e execute o seguinte comando para adicionar o Tkinter ao seu sistema:
pip install tkinter
Como construir um simulador de Monty Hall usando Python
Você pode encontrar o código-fonte do Simulador Monty Hall neste repositório GitHub.
Importe os módulos aleatórios e Tkinter. A função StringVar facilita o controle do valor de um widget como Label ou Entry. Você pode usar um rótulo para exibir algum texto na tela e uma entrada para buscar a entrada do usuário.
Inicialize a instância do Tkinter e exiba a janela raiz. Defina as dimensões da janela para 600 pixels de largura e 200 pixels de altura usando o método geometry(). Defina um título de janela apropriado e proíba seu redimensionamento.
import random
from tkinter import StringVar, Label, Tk, Entry
window = Tk()
window.geometry("600x200")
window.title("Monty Hall Simulation")
window.resizable(0, 0)
A seguir, configure dois pares de widgets e variáveis para armazenar os resultados da simulação. Seu aplicativo solicitará uma série de execuções para ser concluído. Durante cada corrida, ele simulará o jogo e registrará o resultado em cada caso: se o jogador decide trocar ou manter a mesma escolha.
Usando StringVar(), defina os valores iniciais da mesma escolha e escolha comutada como 0. Defina um widget de entrada e defina seu tamanho de fonte como 5. Declare dois rótulos para exibir a mesma escolha e a escolha comutada e posicione-a. Declare mais dois rótulos que exibirão o valor das variáveis que você definiu anteriormente. Por fim, posicione o widget Entry abaixo desses quatro rótulos.
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)
Defina uma função, simule. Inicialize as variáveis de resultado e obtenha o valor de amostra inserido pelo usuário. Declare uma lista que contenha os itens que as portas revelarão.
Dentro de cada corrida, faça uma lista duplicada das portas originais e embaralhe-a em ordem aleatória. Escolha uma porta aleatória e remova-a – isso simula a escolha do jogador. Em seguida, simule a revelação de Monty: se a primeira porta não contiver o prêmio, abra-a, caso contrário, abra a segunda porta. Remova essa escolha e deixe a porta restante como opção de troca.
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 a primeira escolha contiver o prêmio desejado, aumente o resultado da mesma escolha em um e reflita na tela. Caso contrário, execute a mesma operação para a escolha comutada.
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)
Um passo importante é vincular a tecla Enter a um evento na janela do Tkinter. Fazer isso garante que quando o jogador pressionar Enter, uma função específica será executada. Para conseguir isso, passe a string
A função mainloop() diz ao Python para executar o loop de eventos Tkinter e ouvir eventos (como pressionar botões) até você fechar a janela.
no_sample.bind("<Return>", simulate)
window.mainloop()
Junte tudo e execute seu programa para simular o quebra-cabeça em ação.
Saída do Simulador Monty Hall usando Python
Ao executar o programa, você verá uma janela simples com os rótulos de escolha Igual e Comutado. Insira um número de amostra no campo na parte inferior para visualizar os resultados simulados. Nesta amostra de 3 execuções, o programa mostra que ganha uma vez com a mesma escolha e duas vezes com uma troca.
Esses resultados são aleatórios, mas você pode executar a simulação com um tamanho de amostra maior para obter mais precisão. No seguinte tamanho de amostra de 100, a escolha trocada vence 65 vezes.
Resolvendo problemas usando programação
O Simulador Monty Hall é uma excelente demonstração de como você pode usar a programação para resolver problemas da vida real. Você pode desenvolver vários algoritmos e treinar modelos para realizar tarefas específicas, como classificar uma matriz ou melhorar a eficácia de um sistema para uma produção ideal.
Diferentes linguagens de programação oferecem diferentes capacidades e funções para facilitar a programação. Usando Python, você pode criar modelos que podem prever os valores futuros de um conjunto de dados com maior precisão. Além disso, você pode automatizar operações repetitivas, diminuir o trabalho chato e melhorar a velocidade e a precisão.