It is so counter intuitive that it is amazing. The problem is this:
Suppose you're on a game show, and you're given the choice of three doors: Behind one door is a car; behind the others, goats. You pick a door, say No. 1, and the host, who knows what's behind the doors, opens another door, say No. 3, which has a goat. He then says to you, "Do you want to pick door No. 2?" Is it to your advantage to switch your choice?
http://en.wikipedia.org/wiki/Monty_Hall_problem
My intuition says there is no need to change doors. The probability to win a car is obvious and it is 1/3. But the mathematical solution says the probability to win a car if you change doors is 2/3. Amazing if it is true! So lets find out who is right? How? Will make a simulation, will run it many many times and will get the average. This is the Python program that solves the problem:
from __future__ import division
from random import shuffle, choice
def get_random_doors():
doors = ["goat","goat","car"]
shuffle(doors)
return doors
def get_host_open(doors, guest_pick1):
host_open = 0
remaining_doors = [ k for k in [0,1,2]
if k != guest_pick1]
if doors[guest_pick1] == "car":
host_open = choice(remaining_doors)
else:
[host_open] = [d for d in remaining_doors
if doors[d] != "car"]
return host_open
def simulation(strategy):
N = 100000
cars_won = 0
for _ in range(N):
doors = get_random_doors()
guest_pick1 = choice([0,1,2])
host_open = get_host_open(doors, guest_pick1)
if strategy == "stay":
guest_pick_final = guest_pick1
elif strategy == "change":
[guest_pick_final] = [ k for k in [0,1,2]
if k != guest_pick1 and k != host_open]
else:
raise ("Unknown strategy")
if doors[guest_pick_final] == "car":
cars_won += 1
print strategy, cars_won/N
simulation("stay")
simulation("change")
This is a Python 2.4 and 2.5 code. The problem is written with the goal to be easy to read and verify and is not optimized for performance. Lets run it. The result is:
stay 0.33478
change 0.66407
So change doors, definitely change doors if you can!