Created
March 25, 2025 15:42
-
-
Save tayopal/a6fc9421baa244004a0bdbd707fad272 to your computer and use it in GitHub Desktop.
game_theory_test.py
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
#!/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