Skip to content

Instantly share code, notes, and snippets.

@tayopal
Created March 25, 2025 15:42
Show Gist options
  • Save tayopal/a6fc9421baa244004a0bdbd707fad272 to your computer and use it in GitHub Desktop.
Save tayopal/a6fc9421baa244004a0bdbd707fad272 to your computer and use it in GitHub Desktop.
game_theory_test.py
#!/usr/bin/env python3
# This is a little test of the game theory problem posed in this scene:
# https://www.youtube.com/watch?v=CYyUuIXzGgI
import random
class Door:
GOAT = 1
CAR = 2
def __init__(self):
self.selected = False
def set_prize(self, prize):
assert prize in [Door.GOAT, Door.CAR]
self.prize = prize
def set_selected(self):
self.selected = True
def unset_selected(self):
self.selected = False
def open(self):
self.selected = True
print("๐Ÿ" if (self.prize) == Door.GOAT else "๐Ÿš—")
class Contestant:
select_pick = None
open_pick = None
def select_door(self, doors):
pick = random.randrange(1,3)
doors[pick].set_selected()
self.select_pick = doors[pick]
def open_door(self, doors):
pick = random.randrange(1,2)
doors[pick].open()
self.open_pick = doors[pick]
class Host:
def set_prizes(self, doors=[]):
doors[0].set_prize(Door.CAR)
for i in range (1, len(doors)):
doors[i].set_prize(Door.GOAT)
random.shuffle(doors)
def create_doors(self, quantity):
doors = []
for i in range(quantity):
doors.append(Door())
return doors
def set_round_two(self, doors):
available_doors = []
for d in doors:
if not d.selected:
available_doors.append(d)
else:
d.unset_selected()
for d in available_doors:
if d.prize == Door.GOAT:
d.open()
def log_outcome(self, log, pick1, pick2, doors):
# if stay same and win, stay_same_win
# if stay same and lose, change_win
# if change and lose, stay_same_win
# if change and win, change win
if pick1.selected:
if pick1.prize == Door.CAR:
log.stay_same_win()
else:
log.change_win()
else:
if pick1.prize == Door.GOAT:
log.change_win()
else:
log.stay_same_win()
class Log:
stay_same = 0
change = 0
def stay_same_win(self):
self.stay_same += 1
def change_win(self):
self.change += 1
def summary(self):
total = self.stay_same + self.change
print(f"Total: {total}")
print(f"Stay Same Win: {self.stay_same/total}")
print(f"Change Win: {self.change/total}")
def main():
host = Host()
log = Log()
for i in range(1000):
doors = host.create_doors(3)
host.set_prizes(doors)
contestant = Contestant()
contestant.select_door(doors)
host.set_round_two(doors)
contestant.open_door(doors)
host.log_outcome(log, contestant.select_pick, contestant.open_pick, doors)
log.summary()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment