Main Page | See live article | Alphabetical index

Empirical proof of the Monty Hall problem

The purpose of the following Perl program is to prove the result to the Monty Hall problem. It performs a set number of games and keeps track of how often a sticker (someone who sticks to their first choice) and a switcher (someone who switches to another door) would win the game. The results are (within the tolerance of coincidence) close to a sticker/switcher ratio of 1:2, proving the hypothesis that the switcher has twice as much a chance of winning the prize as the sticker.

  1. !/usr/bin/perl

  2. Empirical test of the Monty Hall problem

  3. Use -v to see each game. (default: off)
  4. Use -i # to set number of iterations. (default: 3000)

use strict;

my $iterations = 3000; # How many games to play my $verbosity = 0;

while (@ARGV) {

   my $param = shift @ARGV;
   $verbosity = 1 if $param eq '-v';
   $iterations = int (shift @ARGV) if $param eq '-i';
}

sub verbose {

   print $_[0]."\\n" if $verbosity;
}

my $stickers; my $switchers;

print "Playing $iterations games...\\n\\n";

for(1..$iterations) {

   my @items = qw(goat goat prize);     # two goats, one prize
   my @door;

while (@items) { # this puts the @items into the @door array in random order push (@door, splice (@items, int rand @items, 1)); }

verbose ("Door 0: $door[0]; Door 1: $door[1]; Door 2: $door[2]");

my $contestant = int rand 3; verbose ("Contestant chooses door $contestant.");

my $monty;

# If the contestant picked the prize, Monty picks another door by random. if ($door[$contestant] eq 'prize') { $monty = ($contestant + (int rand 2) + 1) % 3; }

# Otherwise, he picks the other goat. else { $monty = $door [ ($contestant+1) % 3 ] eq 'goat' ? ($contestant+1) % 3 : ($contestant+2) % 3; }

verbose ("Monty opens door $monty.");

# Now only two doors are open. If the sticker wins, the switcher loses and vice versa. if ($door[$contestant] eq 'prize') { verbose ("Sticker wins. Switcher loses."); $stickers++; } else { verbose ("Sticker loses. Switcher wins."); $switchers++; }

}

print "Grand totals: Sticker has won $stickers times Switcher has won $switchers times ";