O problema de Monty Hall em Python

Novamente, este é outro exercício de codificação em Dream.In.Code. Bem, na verdade é um desafio, mas como minha apresentação empalidece em comparação com as outras, não prefiro chamá-la como uma.

Qual é o problema de Monty Hall ?

Suponha que você esteja em um game show e tenha a opção de escolher entre três portas: Atrás de uma porta está um carro; atrás dos outros, cabras. Você escolhe uma porta, digamos nº 1 [mas a porta não está aberta], e o anfitrião, que sabe o que há atrás das portas, abre outra porta, digamos nº 3, que tem uma cabra. Ele então diz a você: “Você quer escolher a porta nº 2?” É vantajoso mudar de escolha?

Leia mais aqui:
http://www.dreamincode.net/forums/topic/292496-prove-the-monty-hall-problem-via-simulation/
http://en.wikipedia.org/wiki/Monty_Hall_problem

Basicamente, você precisa provar que trocar de porta quando solicitado a trocar aumentará suas chances em 2/3, em oposição à chance de 1/3 se você não trocar de porta.

Aqui está o que eu preparei:

Criação de porta

def addDoors():
picker
= randint(0,1)
if picker == 1:
door1
,door2,door3 = "dragon","goat","goat"
else:
door1
= "goat"
picker
= randint(0,1)
if picker == 1:
door2
,door3 = "dragon","goat"
else:
door2
,door3 = "goat","dragon"
return [door1,door2,door3]

Abridor de porta de cabra

def openGoatDoor(doors):
door
= ""
while door != "goat":
doorNumber
= randint(0,2)
door
= doors[doorNumber]
return doorNumber

Simulação Monty Hall

def montyhall(doorNumber,switchOk):
doors
= addDoors()
goatDoor
= addDoors()
while goatDoor == doorNumber:
goatDoor
= openGoatDoor(doors)
if switchOk == "yes":
doorNumber
= [y for y in range(2) if y not in [doorNumber,goatDoor]]
return doors[doorNumber[0]]
else:
return doors[doorNumber]

O testador

def testMontyHall(playTimes,switch):
wondragon
,wonGoat = 0,0
for i in range(playTimes):
prize
= montyhall(randint(0,2),switch)
if prize == "dragon":
wondragon
+= 1
else:
wonGoat
+= 1
print "Dragons:",wondragon
print "Goat:",wonGoat

Os resultados
>>> testMontyHall (1000000, “não”)
Dragões: 332961
Cabra: 667039
>>> testMontyHall (1000000, “sim”)
Dragões: 666757
Cabra: 333243

E isso conclui o show Monty Hall. Espero que você tenha aproveitado.