Monty Hall meets Monte Carlo
In honor of CBS canceling The Guiding Light after 72 years, and replacing it with a new incantation of Let’s Make A Deal, I decided to apply a little brute force computing to The Monty Hall problem.
Here is the VB.NET code to run the simulations. I decided to only apply a few different Monty Hall behaviors and a few different player behaviors, but it should be enough to drive home the paradox.
Module Module1 Sub Main() Dim i, j, ctr As Integer Dim doorSwitch As String = "?" Dim smartMonty As String = "?" Dim prizeDoor(3) As Boolean Dim rand As Random = New Random() Dim doorMontyOpens As Integer Dim doorYouOpen As Integer Dim carsWon As Integer = 0 Console.WriteLine("The Monty Hall Problem") Console.Write("How many times to run the simulation? ") ctr = Val(Console.ReadLine()) If ctr < 1 Then End Console.Write("Are you going to switch doors? [Y/N/M] ") While Not "YNM".Contains(doorSwitch) doorSwitch = Console.ReadKey.KeyChar.ToString.ToUpper End While Console.WriteLine() Console.Write("Does Monty know where the car is? [Y/N/M] ") While Not "YNM".Contains(smartMonty) smartMonty = Console.ReadKey.KeyChar.ToString.ToUpper End While Console.WriteLine() For i = 1 To ctr ' set up the prize doors For j = 1 To 3 prizeDoor(j) = False Next prizeDoor(rand.Next(1, 4)) = True Console.Write(i.ToString() + " (") For j = 1 To 3 Console.Write(If(prizeDoor(j), "$", j.ToString)) Next Console.Write(") -- ") ' Monty shows you a door If smartMonty = "Y" Or (smartMonty = "M" And _ rand.NextDouble > 0.5) Then doorMontyOpens = If(prizeDoor(2), 3, 2) Else doorMontyOpens = rand.Next(2, 4) If prizeDoor(doorMontyOpens) Then carsWon = carsWon + 1 Console.WriteLine("Monty revealed the car!!!!!") Continue For End If End If Console.Write("Monty reveals a goat behind door #" + _ doorMontyOpens.ToString + " -- ") ' pick a door to open If doorSwitch = "Y" Or (doorSwitch = "M" And _ rand.NextDouble > 0.5) Then doorYouOpen = If(doorMontyOpens = 2, 3, 2) Console.Write("You switched to door #" + _ doorYouOpen.ToString + " -- ") Else doorYouOpen = 1 Console.Write("You stayed with door #1 -- ") End If ' did we win? If prizeDoor(doorYouOpen) Then Console.WriteLine("You won the car!!!!!") carsWon = carsWon + 1 Else Console.WriteLine("You won the goat.") End If Next Console.WriteLine(" ") Console.WriteLine("You won the car " + carsWon.ToString + _ " times out of " + ctr.ToString) Console.WriteLine("Winning percentage: " + (carsWon * _ 100.0 / ctr).ToString("##0.0")) Console.WriteLine(" ") Console.WriteLine("Strike any key to end...") Console.ReadKey() End Sub End Module |
Now if CBS ever decides to cancel The Young And The Restless, we are going to have a real problem on our hands.