in reply to Re^7: Marilyn Vos Savant's Monty Hall problem
in thread Marilyn Vos Savant's Monty Hall problem

The code for option 3 is quite confusing. It took me a while to figure out exactly what it was doing.

my @available = grep { $door[ $choice ] eq 'car' ? ( $_ != $choice ) : ( $doors[ $_ ] eq +'car' ) } 0 .. 2;

Hmm.. I guess that's not much clearer either.

Update: so I rewrote the code, and I think this is clearer:

for ( 1 .. 100_000 ) { my @door = 0 .. 2; my $car_door = int rand @door; my $my_pick = int rand @door; @door = grep { $_ != $my_pick } @door; ## Option 1: The host reveals a goat #my @available = grep { $_ != $car_door } @door; # Option 2: The host opens a random unopened door #my @available = @door; ## Option 3: The host tries to be malicious #my @available = @door; #@available = grep { $_ == $car_door } @door if $my_pick != $car_d +oor; my $opened = $available[ rand @available ]; if( $opened == $car_door ) { $my_pick == $car_door ? $skip_car++ : $skip_goat++; next; } ## Count my wins if I stick or switch $my_pick == $car_door ? $stick++ : $switch++; }

Makeshifts last the longest.

Replies are listed 'Best First'.
Re^9: Marilyn Vos Savant's Monty Hall problem
by tilly (Archbishop) on Aug 23, 2004 at 23:04 UTC
    I don't think that there is a good short way to state it.

    Perhaps the best way is to be verbose as in:

    my @available; if ( $door[ $choice ] eq 'car' ) { # Can't beat him yet @available = grep { $choice != $_ } 0 .. 2; } else { # Make him lose! @available = grep { $doors[ $_ ] eq 'car' } 0 .. 2; }

      How about ?

      my $MontysChoice; if( $doors[ choice ] ne 'car' ) { $MontysChoice = grep{ $doors[ $_ ] eq 'car' } 0 .. 2; } else { $MontysChoice = ( grep{ $_ != $choice } 0 .. 2 )[ rand 2 ]; }

      Examine what is said, not who speaks.
      "Efficiency is intelligent laziness." -David Dunham
      "Think for yourself!" - Abigail
      "Memory, processor, disk in that order on the hardware side. Algorithm, algorithm, algorithm on the code side." - tachyon