≡ Menu

Monty Hall Monte Carlo — Python

The python source code for the Monte Carl of the Monty Hall Bet that I proposed. Feel free to comment or suggest improvements!

#!/usr/bin/env python
# encoding: utf-8
"""
MontyHall.py
 
Created by Jonathan Whitmore on 2010-11-25.
"""
 
import sys
import os
import numpy as np
import locale
import random as ra
import pylab as pl
 
locale.setlocale(locale.LC_ALL, '') # Prints the dollar amounts pretty
# -- if this is causing errors, comment it out
 
SwitchBet = 1.08 # Value of bet that switching will pay
StayBet = 1.00 # Value of bet that staying will pay
Doors = 3 # How many doors are being offered
Rounds = 10000 # How many rounds we go
DoorArray = np.arange(Doors) + 1 #Holds the door number 1, 2, 3,...
 
StayDoor = 1 # Initial door picked by both Stay and Switch
NotStayDoor = DoorArray[np.where(DoorArray != StayDoor)] # Array of doors
# that aren't the StayDoor
 
print "SwitchBet is ",locale.currency(SwitchBet)
print "StayBet is ",locale.currency(StayBet)
print "Total Number of Doors: ", Doors
print "Total Number of Rounds: ", Rounds
 
SwitchBank = 0.0 # Set everything to zero
StayBank = 0.0   # Set everything to zero
SwitchWins = 0.0 # Set everything to zero
StayWins = 0.0   # Set everything to zero
StayWinRatio = [] # For statistical analysis
SwitchWinRatio = [] # For statistical analysis
for i in range(Rounds):
  WinningDoor = ra.choice(DoorArray) # Randomly choose door with prize
  # print "Round",i
  # print "The prize is behind door: ", WinningDoor
  RevealDoors = NotStayDoor[np.where(NotStayDoor != WinningDoor)]
  #Array of losing doors that are not the StayDoor
  # and not the WinningDoor
  RevealDoor = ra.choice(RevealDoors) # Randomly choose one from RevealDoors
  # print "Revealing Door: ", RevealDoor
  SwitchingOptions = NotStayDoor[np.where(NotStayDoor != RevealDoor)]
  SwitchDoor = ra.choice(SwitchingOptions)
  # print "Switching to Door: ", SwitchDoor
  if SwitchDoor == WinningDoor:
    SwitchWins += 1.0 # Add to number of Switch wins
    SwitchBank += StayBet # Add StayBet to SwitchBank
    StayBank -= StayBet # Subtract StayBet from StayBank
  if StayDoor == WinningDoor:
    StayWins += 1.0 # Add to number of Stay wins
    SwitchBank -= SwitchBet # Subtract SwitchBet from SwitchBank
    StayBank += SwitchBet # Add SwitchBet to StayBank
  StayWinRatio.append(StayWins/(i+1)) # Statistical Analysis
  SwitchWinRatio.append(SwitchWins/(i+1)) # Statistical Analysis
 
print "Staying Percent Wins: ", round(StayWins/Rounds,4)*100,"%"
print "Switching Percent Wins: ", round(SwitchWins/Rounds,4)*100,"%"
print "The person who stays nets: ", locale.currency(StayBank)
print "The person who switches nets: ", locale.currency(SwitchBank)