Last active
December 29, 2016 00:16
-
-
Save IanCal/f6eff5cebd987fbec21741d9716e5d52 to your computer and use it in GitHub Desktop.
Monty hall variations in strategy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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