Ghostboard pixel

Swift Playground: The Monty-Hall-Problem

Swift Playground: The Monty-Hall-Problem

The Monty-Hall-Problem is a very confusing probability problem. Instead of doing mathematics, we will experiment on a Swift playground.

Hint: This post has been updated to Swift 3

The Monty-Hall-Problem

The idea is very simple. It is explained in Parade magazine in 1990:

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?

In fact, it is to your advance to switch! If you switch, you have a probability of 2/3 to win the car. On the other hand, if you don’t switch, your probability is just 1/3. Of course you can proof this mathematically. But we want to experiment.

The Algorithm

The algorithm is very straightforward. First, you choose a door. Then, the host has to open one door, which has a goat. If your first pick is the car, he has to open one of the two other doors at random. If your first pick is a goat, he has to open the one remaining door, which has a goat. Finally, depending on your strategy, you switch or not.

The Playground

Let’s program a small playground. All together we have 10,000 rounds per strategy:

import UIKit

enum Strategy {
    case Change
    case Stay

func play(strategy:Strategy,repeats:Int) -> Int {
    var wins = 0
    for _ in 0..<repeats {
        let car = Int(arc4random_uniform(3))
        var playerChoice = Int(arc4random_uniform(3))
        if strategy == Strategy.Change {
            if playerChoice == car {
                var remainingDoors = [0,1,2]
                remainingDoors.remove(at: playerChoice)
                playerChoice = remainingDoors[Int(arc4random_uniform(2))]
            } else {
                playerChoice = car
        if car == playerChoice {
            wins += 1
    return wins

var repeats = 100000

var winsStrategyChange = play(strategy: .Change, repeats: repeats)
var winsStrategyStay = play(strategy: .Stay, repeats: repeats)

var quoteStrategyChange = Double(winsStrategyChange) / Double(repeats)
var quoteStrategyStay = Double(winsStrategyStay) / Double(repeats)

The Results

Of course the results are changing a little bit every time you are running the playground, but are always very similar. For example, one result was:

  • winsStrategyChange: 66,461
  • winsStrategyStay: 33,509
  • quoteStrategyChange 0,66461
  • quoteStrategyStay: 0,33509

The result are as the theory predicts. If you don’t switch the door, you are wining in about 33 percent of the cases. On the other hand, if you do switch the door, you are winning in about 66 percent of the cases.

[thrive_text_block color=”blue” headline=”Conclusion”]It makes a lot of fun to experiment in playgrounds. In this case, we were able to verify a theory that is a bit confusing at the first sight.[/thrive_text_block]


Image: @ Lim ChewHow /
Wikipedia: Monty Hall Problem