Skip to content

Instantly share code, notes, and snippets.

@IanCal
Last active December 29, 2016 00:16
Show Gist options
  • Save IanCal/f6eff5cebd987fbec21741d9716e5d52 to your computer and use it in GitHub Desktop.
Save IanCal/f6eff5cebd987fbec21741d9716e5d52 to your computer and use it in GitHub Desktop.
Monty hall variations in strategy
from random import randint, shuffle
from collections import Counter
DOORS = 3
EXPERIMENTS = 1000
def get_doors():
doors = [True] + [False] * (DOORS - 1)
shuffle(doors)
return doors
def single_known_remain():
"""Known pick, contestant remains"""
doors = get_doors()
contestant_pick = randint(0, DOORS - 1)
monty_pick = contestant_pick
while monty_pick == contestant_pick or doors[monty_pick]:
monty_pick = randint(0, DOORS - 1)
# contestant does not change
if doors[contestant_pick]:
return "win"
return "lose"
def single_unknown_remain():
"""Unknown pick, contestant remains"""
doors = get_doors()
contestant_pick = randint(0, DOORS - 1)
monty_pick = contestant_pick
while monty_pick == contestant_pick:
monty_pick = randint(0, DOORS - 1)
if doors[monty_pick]:
return "game over"
# contestant does not change
if doors[contestant_pick]:
return "win"
return "lose"
def single_known_swap():
"""Known pick, contestant swaps"""
doors = get_doors()
contestant_pick = randint(0, DOORS - 1)
monty_pick = contestant_pick
while monty_pick == contestant_pick or doors[monty_pick]:
monty_pick = randint(0, DOORS - 1)
# contestant changes
original_pick = contestant_pick
while contestant_pick == monty_pick or contestant_pick == original_pick:
contestant_pick = randint(0, DOORS - 1)
if doors[contestant_pick]:
return "win"
return "lose"
def single_unknown_swap():
"""Unknown pick, contestant swaps"""
doors = get_doors()
contestant_pick = randint(0, DOORS - 1)
monty_pick = contestant_pick
while monty_pick == contestant_pick:
monty_pick = randint(0, DOORS - 1)
if doors[monty_pick]:
return "game over"
# contestant changes
original_pick = contestant_pick
while contestant_pick == monty_pick or contestant_pick == original_pick:
contestant_pick = randint(0, DOORS - 1)
if doors[contestant_pick]:
return "win"
return "lose"
for func in [single_known_swap, single_known_remain, single_unknown_remain, single_unknown_swap]:
results = Counter(func() for x in range(EXPERIMENTS))
print(func.__doc__)
print("\tWins: %2.2f%%\n\tLosses: %2.2f%%\n\tGames cancelled: %2.2f%%" % (100 * results["win"] / EXPERIMENTS,
100 * results["lose"] / EXPERIMENTS,
100 * results["game over"] / EXPERIMENTS))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment