The Monty Hall problem is a famous conundrum in probability which takes the form of a hypothetical game show. The contestant is presented with three doors; behind one is a car and behind each of the other two is a goat. The contestant picks a door and then the gameshow host opens a different door to reveal a goat. The host knows which door conceals the car. The contestant is then invited to switch to the other closed door or stick with their initial choice.
Perhaps counter-intuitively, the best strategy for winning the car is to switch, as demonstrated by the following simulation.
import random
def run_trial(switch_doors, ndoors=3):
"""
Run a single trial of the Monty Hall problem, with or without switching
after the gameshow host reveals a goat behind one of the unchosen doors.
(switch_doors is True or False). The car is behind door number 1 and the
gameshow host knows that.
"""
# Pick a random door out of the ndoors available
chosen_door = random.randint(1, ndoors)
if switch_doors:
# Reveal a goat
revealed_door = 3 if chosen_door==2 else 2
# Make the switch by choosing any other door than the initially-
# selected one and the one just opened to reveal a goat.
available_doors = [dnum for dnum in range(1,ndoors+1)
if dnum not in (chosen_door, revealed_door)]
chosen_door = random.choice(available_doors)
# You win if you picked door number 1
return chosen_door == 1
def run_trials(ntrials, switch_doors, ndoors=3):
"""
Run ntrials iterations of the Monty Hall problem with ndoors doors, with
and without switching (switch_doors = True or False). Returns the number
of trials which resulted in winning the car by picking door number 1.
"""
nwins = 0
for i in range(ntrials):
if run_trial(switch_doors, ndoors):
nwins += 1
return nwins
ndoors, ntrials = 3, 10000
nwins_without_switch = run_trials(ntrials, False, ndoors)
nwins_with_switch = run_trials(ntrials, True, ndoors)
print('Monty Hall Problem with {} doors'.format(ndoors))
print('Proportion of wins without switching: {:.4f}'
.format(nwins_without_switch/ntrials))
print('Proportion of wins with switching: {:.4f}'
.format(nwins_with_switch/ntrials))
In this program, without loss of generality we have placed the car behind door number 1, leaving the contestant to initially choose any door at random.
To make the code a little more interesting, we have allowed for a variable number of doors (change the value of the variable ndoors
) in the simulation (but only one car).
Monty Hall Problem with 3 doors
Proportion of wins without switching: 0.3334
Proportion of wins with switching: 0.6737