How to simulate Monty Hall problem in computer?

5.6k Views Asked by At

Suppose you're on a game show, and you're given the choice of three doors: Behind one door is a car; behind the others, goats. You pick a door, say No. 1 [but the door is not opened], and the host, who knows what's behind the doors, opens another door, say No. 3, which has a goat. He then says to you, "Do you want to pick door No. 2?" Is it to your advantage to switch your choice?

This is Monty Hall problem, and we know that a switching strategy really does win two out of three times on the average. But is it possible to simulate it in Matlab?

2

There are 2 best solutions below

0
On

Some pseudocode:

  1. Set winswap = 0, winnoswap = 0 and simcount = 0.
  2. Increment simcount by 1.
  3. Set car = random value from a choice of $\{ 1, 2, 3\}$.
  4. Set guess = random value from a choice of $\{1, 2, 3\}$.
  5. Set goat = random value from a choice of $\{1, 2, 3\}$ that is not equal to either car or guess.
  6. Set swap = random value from a choice of $\{1, 2\}$.
  7. If swap = 2, set guess = the first value of $\{1, 2, 3\}$ that is not equal to either goat or guess.
  8. If guess = car and swap = 1, increment winnoswap by 1.
    If guess = car and swap = 2, increment winswap by 1.
  9. If simcount is below some predetermined value, return to step 2.
  10. Compare the values of winswap and winnoswap.
4
On

After the interesting Mythbusters episode on the problem, I wrote a bit of Python code to simulate the results for fun. The code can be simplified considerably by breaking it into two trials, one where you always stay with your choice, and the other where you always swap. A further simplification can be had with the following two observations:

  1. If you always keep your choice, you only win when you select the car (guess == car)
  2. If you always swap, you only win when you do not select the car (guess != car)

This allows one to avoid computing the positions of the goats and the door Monty decides to remove. I am not really familiar with MATLAB, so I will just include the Python code below, but I hope it gives the basic idea for porting to your language of choice.

import random
import sys

def main():
  if len(sys.argv) < 2:
    print "usage: monty.py trials"
    sys.exit(1)

  t = int(sys.argv[1])

  # Stick with door
  stick_winners = 0
  for i in xrange(t):
    car = random.randint(1, 3)
    choice = random.randint(1, 3)
    if car == choice:
      stick_winners += 1
  print "(stick) won:", stick_winners, "out of", t, float(stick_winners) / float(t)

  # Switch door
  switch_winners = 0
  for i in xrange(t):
    car = random.randint(1, 3)
    choice = random.randint(1, 3)
    # If car != choice, open a goat door and switch, win the car
    if car != choice:
      switch_winners += 1
  print "(switch) won:", switch_winners, "out of", t, float(switch_winners) / float(t)

if __name__ == "__main__":
  main()