#!/usr/bin/perl # Empirical test of the Monty Hall problem # Use -v to see each game. (default: off) # 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 ";
See also: Monty Hall problem
Search Encyclopedia
|
Featured Article
|