See the Wikipedia entry for a summary of the problem.
Here's some code to pick a door at random.
See Real Python's Generating Random Data in Python for more information.
# Python provides a library called random to generate pseudo-random numbers and do stuff with them.
import random
# The three doors in a list.
doors = ['red', 'green', 'blue']
# Pick a random door.
print(random.choice(doors))
blue
The pick is meant to give a one third probability to each door. Let's pick 10,000 doors are see if that looks correct.
# 10,000 random doors.
no_doors = 10000
tenthous = [random.choice(doors) for i in range(no_doors)]
# Count the number of each colour.
red = tenthous.count('red')
blue = tenthous.count('blue')
green = tenthous.count('green')
print("First ten items: ", tenthous[:10])
print(f"Out of the {no_doors}: {red} were red, {green} were green, and {blue} were blue.")
First ten items: ['green', 'green', 'red', 'red', 'green', 'red', 'green', 'green', 'blue', 'red'] Out of the 10000: 3324 were red, 3357 were green, and 3319 were blue.
Let's plot it and see that each door is picked about a third of the time.
# We'll just use pyplot for plotting.
import matplotlib.pyplot as plt
# Change the way plots look.
plt.style.use('seaborn')
fig, ax = plt.subplots(figsize=(12,4))
ax.barh(['Red', 'Green', 'Blue'], [red, green, blue], color=['#FC4F30', '#6D904F', '#008FD5']);
Let's simulate the game now with the following steps:
The question we're looking to answer is whether staying with your original pick makes a difference.
def simulate(stay=True):
"""A function to simulate a game and tell us if the contestant wins.
The contestant's strategy is to stay with their original choice
if the parameter stay is True, and otherwise they switch."""
# The three doors.
doors = ['red', 'green', 'blue']
# 1. Pick a door to put the car behind.
car = random.choice(doors)
# 2. Have the contestant pick a door.
pick = random.choice(doors)
# 3. Have the show host open one of the other doors to reveal a goat.
canopen = [door for door in doors if door != car and door != pick]
show = random.choice(canopen)
# 4. Ask the contestant if they want to switch (specified by stay parameter).
if not stay:
# This is a bit hacky but gets the job done.
pick = [door for door in doors if door != pick and door != show][0]
# 5. Figure out whether or not the contestant wins.
if pick == car:
return True
else:
return False
We can now simulate a game in which the contestant stays with their original pick by running the following.
A return value of True means they won the car, False means they didn't.
simulate(stay=True)
False
Let's run the game 10,000 times where the contestant stays.
We'll see how often they win.
staying = [simulate(stay=True) for i in range(10000)]
Plot the result of staying.
fig, ax = plt.subplots(figsize=(12,4))
ax.barh(['Win', 'Lose'], [staying.count(True), staying.count(False)], color=['#6D904F', '#FC4F30']);
Looks like when the contestant stays, they win only about a third of the time.
Let's run the game 10,000 times where the contestant switches.
We'll see how often they win.
switching = [simulate(stay=False) for i in range(10000)]
fig, ax = plt.subplots(figsize=(12,4))
ax.barh(['Win', 'Lose'], [switching.count(True), switching.count(False)], color=['#6D904F', '#FC4F30']);
Looks like you win two thirds of the time if you switch.