Monty Hall em 30 linhas

O problema de Monty Hall é um quebra-cabeça matemático que apresenta uma solução surpreendentemente contra-intuitiva.

É descrito como uma história sobre um game show. Nele, o anfitrião (Monty) mostra três portas fechadas e diz que atrás de uma está um carro novo, mas atrás de cada uma das outras duas está uma cabra. Você escolherá uma porta e ganhará o que estiver atrás (para ser claro, você quer o carro). Para lhe dar uma chance esportiva, Monty lhe dará uma dica e uma oportunidade para mudar de ideia.

Especificamente,

  • Você escolhe uma das 3 portas fechadas.
  • Monty abre uma das outras duas portas e mostra uma cabra.
  • Ele então pergunta se você gostaria de mudar de ideia e opta pela porta fechada restante.
  • Você faz sua escolha e leva seu prêmio.

A questão é: você deve mudar de ideia ou não? Surpreendentemente, a maioria das pessoas conclui que a escolha não pode importar: é um 50-50 de qualquer maneira. Não é. Na verdade, você deve sempre escolher trocar, pois isso dobra suas chances de ganhar!

Já que você provavelmente não acredita em mim, vá em frente e cole esta canção de rubi e convença-se. Para (várias) explicações sobre este efeito, consulte a página da Wikipedia.

#! /usr/bin/env ruby

# http://en.wikipedia.org/wiki/Monty_Hall_problem
def monty(switch)
doors
= (0...3).to_a
winner
= rand(doors.size)
guess
= rand(doors.size)

revealable
= doors - [guess, winner]
revealed
= revealable[rand(revealable.size)]
other
= (doors - [guess, revealed]).first

guess
= other if switch
guess
== winner
end

TRIALS
= 10000
won_staying
, won_switching = 0, 0
(0...TRIALS).each do |trial|
won_staying
+= 1 if monty(false)
won_switching
+= 1 if monty(true)
end

puts
"Win frequencies in Monty Hall when"
puts
" staying: #{100.0 * won_staying / TRIALS}%"
puts
" switching: #{100.0 * won_switching / TRIALS}%"

# Win frequencies in Monty Hall when
# staying: 33.03%
# switching: 66.38%