In the last part of this blog series I showed a DistributionMonad, which allows to perform queries to probability scenarios. Today we will use this monad in order to solve the famous Monty Hall problem. This article is based on the excellent paper by Martin Erwig and Steve Kollmansberger called "Functional Pearls: Probabilistic functional programming in Haskell".
“Suppose you’re on a game show, and you’re given the choice of three doors: Behind one door is a car; behind the others, goats. You pick a door, say No. 1, and the host, who knows what’s behind the doors, opens another door, say No. 3, which has a goat. He then says to you, "Do you want to pick door No. 2?" Is it to your advantage to switch your choice?”
Let’s start by modeling the first choice using the DistributionMonad:
As we can see the solution is 1/3 as we expected and if we don’t switch, we stay with these odds. But if we switch we might improve the probability for a car. Remember the host will always remove a Goat after your first pick. Let’s analyze the second pick if we switch:
Car behind | First choice | Temp. Outcome | Host removes | Switching to | Outcome |
---|---|---|---|---|---|
Door 1 | Door 1 | Car | Door 2 | Door 3 | Goat |
Door 1 | Door 1 | Car | Door 3 | Door 2 | Goat |
Door 1 | Door 2 | Goat | Door 3 | Door 1 | Car |
Door 1 | Door 3 | Goat | Door 2 | Door 1 | Car |
If the Car is behind door 2 or door 3 the situation is symmetrical and therefor we can conclude, the following:
And if we run this, we get this nice solution:
Next time I will show how we can use the DistributionMonad to solve some basic poker scenarios.
Tags: F#, monad