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
							 | 
						|
								";
							 |