[REBOL] Re: A Rebol Challenge. The Monty Hall Puzzle
From: carl:cybercraft at: 18-Dec-2001 11:57
On 17-Dec-01, Carl Read wrote:
> Here's a fixed version...
> rebol[]k: s: 0 r: func[n][random n]m: does[p: r 3 c: r 3 p = c] loop
> 10000 [if m[k: k + 1]if not m[s: s + 1]]print ["Kept" k "Switched"
> s]
> Nowhere near as short as some of the other posts, but anyway, here's
> my reasoning behind it...
> The prize is placed behind one of 3 doors...
> prize: random 3
> You choose one of the doors...
> chosen: random 3
> Now, Monty can see if they're a match - ie, if you've picked a
> winner...
> matched?: prize = chosen
> Which returns true if you've chosen the prize. If you decide to keep
> this then it's obvious (I hope:) that you had 1 chance in 3 of
> picking the prize.
> But what if you accept Monty's offer to switch? Well, there's only
> two posibilities:
> 1) You'd chosen the prize, so switching from that means you lose
> regardless of what Monty does.
> 2) You hadn't chosen the prize, Monty exposes the other losing door,
> and so you switch to the winning door.
> So a switch always means a reversal of your original choice - a
> winning choice becoming a losing one and vice-versa. So...
> matched?: not matched?
> But what happens to the "1 chance in 3 of picking the prize."? Well
> that also means you had 2 chances in 3 of losing, right? And the
> switch makes an original loss a win, so switching gives you 2
> chances in 3 of winning, thus doubling your chances of a win.
After showing the above explaination to someone (not on this list)
they still didn't believe it, so I've written a graphical version in
the hope that pictures will win out where words fail... (Not a View
version though - run it from the Console.)
rebol []
doors: func [n c][
d: copy/deep ["[ ]" "[ ]" "[ ]"]
d/:n/2: c
return d
]
game: does [
print " Switching Keeping"
prize: random 3
print ["Prize: " doors prize #"P" " " doors prize #"P"]
guess: random 3
print ["Guess: " doors guess #"G" " " doors guess #"G"]
opened: first random difference [1 2 3] reduce [prize guess]
prin ["Opened:" doors opened #"X"]
prin " "
print either prize = guess [kept: kept + 1 "Win"]["Loss"]
sw: first difference [1 2 3] reduce [guess opened]
print ["Switch:" doors sw #"S"]
prin " "
print either prize = sw [switched: switched + 1 "Win"]["Loss"]
played: played + 1
print [
"Wins: " switched " "
kept
" Played:" played
]
]
played: 0
kept: 0
switched: 0
quit?: false
print ""
while [not quit?][
game
print ""
print "Enter to continue - Esc to quit."
inp: input
quit?: inp = "q"
]
Enough! (:
--
Carl Read