20 Aug 2025 - by 'Maurits van der Schee'
The Monty Hall problem is a probability puzzle. It has no logical contradiction, but for many people the result goes against their intuition. The problem originates from the American television game show "Let's Make a Deal". It is named after its original host, Monty Hall. The problem is stated as:
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?
The problem can be simplified and summarized as:
If your initial guess is the car (chance 1/3) then you shouldn't switch, otherwise you should (and you will win).
To see that this is the case you can write down all possibilities or you can do what I did: a Monte Carlo simulation.
A Monte Carlo simulation is where you execute a probability experiment many times using a random number generator to determine the chances of winning. Here is the code written in PHP:
<?php
// function to determine win on monty hall problem
function monty_hall(array $doors, string $winner, string $chosen, bool $change): bool
{
while (true) {
// choose a random door to open
$open = $doors[array_rand($doors)];
// if door is not winning and not chosen open it
if ($open != $winner && $open != $chosen) {
break;
}
}
// remove the open door from the array
$doors = array_diff($doors, [$open]);
// do you want to change?
if ($change) {
// remove the chosen door
$doors = array_diff($doors, [$chosen]);
// choose another door
$chosen = $doors[array_rand($doors)];
}
return $chosen == $winner;
}
// monte carlo simulation to determine win chance of monty hall problem
$runs = 100000;
$wins = 0;
for ($i = 0; $i < $runs; $i++) {
// doors is an array of closed doors
$doors = ["Door 1", "Door 2", "Door 3"];
// choose a random winning door
$winner = $doors[array_rand($doors)];
// choose a random door to open
$chosen = $doors[array_rand($doors)];
// increment win count on win
if (monty_hall($doors, $winner, $chosen, true)) {
$wins += 1;
}
}
echo round(100 * $wins / $runs) . "%\n";
See: https://github.com/mevdschee/monty-hall-problem
Happy coding!
PS: Liked this article? Please share it on Facebook, Twitter or LinkedIn.