The Monty Hall problem has annoyed me for a while. Not that I didn’t understand it, the wiki page (http://en.wikipedia.org/wiki/Monty_Hall_problem) is quite extensive and explains it quite nicely, the problem is that I could never truely believe that by switching door, your chances of winning are 2/3 instead of 1/3 if you stick.
So I decided to test it.
And you know what, it’s true!
#!/usr/bin/python
from random import randint
# Monty Hall Problem Simulator
# jsutton.co.uk 2014
#
# This Python script simulates the Monty Hall Problem
# http://en.wikipedia.org/wiki/Monty_Hall_problem
# Modify 'runs' to change the number of iterations
# Door Key
# 0: Goat
# 1: Car
# 2: Removed Door
###### Functions ######
# Generate the three doors
def generate_doors():
doors = [0,0,0]
winning_door = randint(0,2)
doors[winning_door] = 1
return doors
# Return the index of the alternative door once
# one has been chosen, and one removed
def get_alternative_door(door_array, selected_door):
for door_index, door in enumerate(door_array):
if door_index is not selected_door:
if door is not 2:
return door_index
# Return True or False if the selected door
# Is a winning door
def is_door_winner(door_array, selected_door):
door_result = door_array[selected_door]
if door_result is 0:
return False
elif door_result is 1:
return True
else:
print("Something Strange Happened: ", door_result)
return False
# Returns True if swapping would have won
def monty_cycle():
doors = generate_doors()
selected_door = randint(0,2)
door_removed = False
while door_removed is False:
for door_index, door in enumerate(doors):
if door_index is not selected_door:
if door is 0:
rand = randint(0,1)
if rand is 1:
doors[door_index] = 2
door_removed = True
break
alternative_door = get_alternative_door(doors, selected_door)
original_door_winner = is_door_winner(doors, selected_door)
swapped_door_winner = is_door_winner(doors, alternative_door)
return swapped_door_winner
if __name__ == "__main__":
results = []
runs = 100
for i in range(runs):
result = monty_cycle()
results.append(result)
total_success = sum(results)
total_failure = runs - total_success
tsp = (total_success / runs) * 100
tfp = (total_failure / runs) * 100
print("Total Runs: ", runs)
print("Runs that won by swapping: ", total_success)
print("Runs that won by staying: ", total_failure)
print("Swap success: ", tsp, "%")
print("Stay success: ", tfp, "%" )
Nothing complicated, it just generates a set of doors, sets a random door to be winner and then selects the ‘chosen’ door. Once the door has been chosen, a door is ‘removed’. Then we look at whether switching would have resulted in a Win or a loss. (True indicates switching would have won, whereas False indicates that staying would have won).
I did this for 100 runs and got this:
Total Runs: 100
Runs that won by swapping: 67
Runs that won by staying: 33
Swap success: 67.0 %
Stay success: 33.0 %
Welp. I guess that settles it then!