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