O jogo consiste no seguinte: Monty Hall (o apresentador) apresentava 3 portas aos concorrentes, sabendo que atrás de uma delas está um prêmio e que as outras não tem prêmio nenhum. O jogo consistia de três etapas, a saber.
1. O concorrente escolhe uma porta (que ainda não é aberta);
2. Em seguida, Monty abre uma das outras duas portas que o concorrente não escolheu, sabendo de saída que o prêmio não se encontra ali;
3. Agora com duas portas apenas para escolher - pois uma delas já se viu, na 2ª etapa, que não tinha o prêmio - e sabendo que o prêmio ainda está atrás de uma delas, o concorrente tem que se decidir se permanece com a porta que escolheu no início do jogo e a abre, ou se muda para a outra porta que ainda está fechada para então a abrir.
A pergunta é: é melhor trocar de porta? Ou é melhor não trocar? Ou é indiferente?
Quando fui apresentado ao problema, imediatamente respondi: “Tanto faz!”
Meu raciocínio, que provavelmente será o mesmo seu, caro leitor, é simples. Depois de mostrada uma porta, o meu universo era de duas portas. Uma premiada, outra não. Nesse caso eu teria 50% de chances de acertar, independente de trocar ou não a porta. Simples assim, não?
Ledo engano. Meu e seu, amigo!
O programa abaixo, em java, foi feito de maneira um tanto apressada. Mas dá uma boa evidência de que há diferenças entre as estratégias.
Para executá-lo, tendo o Java em seu computador, basta executar os comandos de compilação (javac Montyhall.java) e de execução (java Montyhall).
O programa basicamente repete o experimento 10.000 vezes, para diferentes estratégias. Numa primeira etapa, jamais trocando de porta; depois, sempre trocando de porta.
Os resultados possivelmente surpreenderão. Mas são esses mesmos, podem repetir. Em média, a estratégia de trocar a porta acerta 66,7% das vezes, enquanto a estratégia de não trocar a porta alcançará 33,3% de acerto.
O que é intrigante, sem dúvidas.
A explicação, porém, é um tanto prosaica. Pensemos em probabilidades: havendo três portas, a chance de a porta correta ser selecionada logo de início é de 33%, contra 67% de chances de iniciarmos com alguma porta errada.
Ora: notem que, se optamos pela estratégia “não trocar”, então certamente permaneceremos com a porta que iniciamos. Que tem 33,3% de chances de ser a correta. Logo, o esperado é efetivamente 33,3% de acerto.
Olhemos agora para o que ocorre quando a estratégia é “trocar”. Se selecionamos a porta correta a princípio, então certamente trocaremos por uma porta errada. Ou seja, erraremos com probabilidade igual à de escolhermos a porta correta, que é de 33%. Por outro lado, se escolhemos uma porta errada, e a outra porta errada é aberta (e não é mais selecionável), então certamente trocaremos uma porta errada pela porta correta. Como a chance de selecionarmos uma porta falsa é de 66,7%, temos que, com esta estratégia, nós acertaremos 2/3 das vezes a porta correta.
Copiem o programa daqui, perdoem os comentários em inglês e o pouco preciososmo na codificação, e divirtam-se com esse problema interessante, que propõe um paradoxo aos nossos cérebros.
--------------------------------
public class Montyhall {
String strategy; int number_of_tries, total_matches;
public Montyhall(String s, int n) {
strategy = s;
number_of_tries = n;
total_matches = 0;
}
public void test() {
System.out.println("Starting with strategy "+strategy);
for (int i=0;i
// monty allways starts by selecting the 0 door
int selected = 0;
// the correct door is randomly chosen between 0 and 2
int correct = (int) ((Math.random() * 3));
// the showed door is always other than the 0 and the correct door
int showed = choose_to_show(0, correct);
if ("change".equals(strategy)) { //in this case the selected door must be other one else than the 0 and the showed door
selected = 3 - showed;
}
if (selected == correct) {
total_matches++;
}
System.out.println("Selected the door "+selected+": correct door "+correct+": matches "+total_matches);
}
System.out.println("Done!");
}
public String result() {
return "Strategy: "+strategy+" Tries: "+number_of_tries+" Matches: " + total_matches+ ": "+ ((total_matches*100) / number_of_tries) + "% of success";
}
int choose_to_show(int i, int j) {
if (i==j) { //the chosen and the selected are equals to 0
return (int) (1+ (Math.random() * 2)); //random selection between 1 or 2
}
return 3 - j; //return 1 if j = 2 or 2 if j = 1
}
public static void main(String args[]){
Montyhall monty1 = new Montyhall("not change", 10000);
Montyhall monty2 = new Montyhall("change", 10000);
monty1.test();
monty2.test();
System.out.println(monty1.result());
System.out.println(monty2.result());
}
}






