32 lines
1.2 KiB
FSharp
32 lines
1.2 KiB
FSharp
let montySlower nSims =
|
|
let rnd = new Random()
|
|
let MontyPick winner pick =
|
|
if pick = winner then
|
|
[0..2] |> Seq.filter (fun i -> i <> pick) |> Seq.nth (rnd.Next(0,2))
|
|
else
|
|
3 - pick - winner
|
|
let SwitchGame() =
|
|
let winner, pick = rnd.Next(0,3), rnd.Next(0,3)
|
|
let monty = MontyPick winner pick
|
|
let pickFinal = 3 - monty - pick
|
|
|
|
// Show that Monty's pick has no effect...
|
|
|
|
if (winner <> pick) <> (pickFinal = winner) then
|
|
printfn "Monty's selection actually had an effect!"
|
|
if pickFinal = winner then 1 else 0
|
|
|
|
let StayGame() =
|
|
let winner, pick = rnd.Next(0,3), rnd.Next(0,3)
|
|
let monty = MontyPick winner pick
|
|
|
|
// This one's even more obvious than the above since pickFinal
|
|
// is precisely the same as pick
|
|
|
|
let pickFinal = pick
|
|
if (winner = pick) <> (winner = pickFinal) then
|
|
printfn "Monty's selection actually had an effect!"
|
|
if winner = pickFinal then 1 else 0
|
|
|
|
let Wins (f:unit -> int) = seq {for i in [1..nSims] -> f()} |> Seq.sum
|
|
printfn "Stay: %d wins out of %d - Switch: %d wins out of %d" (Wins StayGame) nSims (Wins SwitchGame) nSims
|