#!/usr/bin/env perl use strict; use warnings; use 5.10.0; # NOTE: we got the thing about the goat being the prize backwards # from how this is usually defined. # basic setup: # you get 3 doors # - initially, you pick a door at random # - second, the host eliminates one of the two remaining doors that you haven't picked # - now, you have the option to switch to the remaining door from the one you've already picked my ($switched, $unswitched) = (0, 0); my $doors = 3; for (my $i = 0; $i < 1000000; $i++) { my $goat = int(rand($doors)); my $initial_selection = int(rand($doors)); # my $host_eliminates = int(rand($doors)); # until (($host_eliminates != $initial_selection) && ($host_eliminates != $goat)) { # $host_eliminates = int(rand($doors)); # } # THIS IS OUR BUG (i kind of think) # my $final_selection = int(rand($doors)); # until ($final_selection != $host_eliminates) { # $final_selection = int(rand($doors)); # } if ($goat == $initial_selection) { $unswitched++; } else { $switched++; } # say "you pick: $initial_selection"; say "host eliminates: $host_eliminates"; # say "goat is: $goat"; # say "final selection is: $final_selection"; # say "correct? " . ($result ? 'yes' : 'no'); if ($i % 10000 == 0) { say "$switched, $unswitched "; } } say "switched from initial decision: $switched"; say "unswitched from initial decision: $unswitched";