# Monty Hall Simulation

by Richard White

A description and analysis of the Monty Hall Problem can be seen here:

I created the following simulation which independently confirms the results as reported in the above wikipedia article.

Each click of the button plays the game a million times.

 Totals for each door: Door 1 Door 2 Door 3 Had the prize: 000000 000000 000000 Contestant's initial choice: 000000 000000 000000 Was opened: 000000 000000 000000 Offered for switching: 000000 000000 000000
 Results: Won: Lost: Never switched: 000000 000000 Always switched: 000000 000000

Below is the javascript code for the simulation. Each click of the "Run Simulation" button above executes the function below called "run_simulation".

[Note to programmers: The coding style was chosen with the hope it will be more readable for non-programmers and thus does not include the usual optimizations.]

```//__________________________________________________________________________
// define global game variables

var maxgames = 1000000;  // number of games to play

var prize         = 0;   // which door the prize is behind
var choice        = 0;   // which door is chosen initially
var opendoor      = 0;   // which door gets opened
var switch_choice = 0;   // which door is offered to switch to

// how many times the prize was behind this door
var tally_prize_behind_door_1 = 0;
var tally_prize_behind_door_2 = 0;
var tally_prize_behind_door_3 = 0;

// how many times the contestant chose this door
var tally_initial_choice_door_1 = 0;
var tally_initial_choice_door_2 = 0;
var tally_initial_choice_door_3 = 0;

// how many times this door was opened
var tally_opened_door_1 = 0;
var tally_opened_door_2 = 0;
var tally_opened_door_3 = 0;

// how many times this door was offered for switching
var tally_switched_to_door_1 = 0;
var tally_switched_to_door_2 = 0;
var tally_switched_to_door_3 = 0;

// how many wins and losses
var never_switch_wins    = 0;
var never_switch_losses  = 0;
var always_switch_wins   = 0;
var always_switch_losses = 0;

//__________________________________________________________________________
function run_simulation() {

reset_variables();

// play the game a bunch of times

for (var game = 0; game < maxgames; game++) {

// Step 1. Randomly assign the prize to a door number
prize = getrandom(3);

// Step 2. Contestant randomly chooses a door number
choice = getrandom(3);

// Step 3. Determine which door to open
opendoor = determine_which_door_to_open();

// Step 4. Determine which door to offer contestant to switch to
switch_choice = determine_which_door_for_switching();

// Step 5. Tally results
tally_results();

}

// After all games played, display the results
display_results();

}

//__________________________________________________________________________
function reset_variables() {

prize          = 0;
choice         = 0;
opendoor       = 0;
switch_choice  = 0;

tally_prize_behind_door_1 = 0;
tally_prize_behind_door_2 = 0;
tally_prize_behind_door_3 = 0;

tally_initial_choice_door_1 = 0;
tally_initial_choice_door_2 = 0;
tally_initial_choice_door_3 = 0;

tally_opened_door_1 = 0;
tally_opened_door_2 = 0;
tally_opened_door_3 = 0;

tally_switched_to_door_1 = 0;
tally_switched_to_door_2 = 0;
tally_switched_to_door_3 = 0;

never_switch_wins    = 0;
never_switch_losses  = 0;
always_switch_wins   = 0;
always_switch_losses = 0;

}

//__________________________________________________________________________
function getrandom(n) {
// return a random number between 1 and n, inclusive.
return Math.floor((Math.random() * n) + 1);
}

//__________________________________________________________________________
function pick_randomly(a, b) {
x = getrandom(2);
if (x == 1) return a;
if (x == 2) return b;
}

//__________________________________________________________________________
function determine_which_door_to_open() {

if (choice == 1) {
if (prize == 1) return pick_randomly(2, 3);
if (prize == 2) return 3;
if (prize == 3) return 2;
}
if (choice == 2) {
if (prize == 1) return 3;
if (prize == 2) return pick_randomly(1, 3);
if (prize == 3) return 1;
}
if (choice == 3) {
if (prize == 1) return 2;
if (prize == 2) return 1;
if (prize == 3) return pick_randomly(1, 2);
}
}

//__________________________________________________________________________
function determine_which_door_for_switching() {

if (choice == 1) {
if (opendoor == 2) return 3;
if (opendoor == 3) return 2;
}
if (choice == 2) {
if (opendoor == 1) return 3;
if (opendoor == 3) return 1;
}
if (choice == 3) {
if (opendoor == 1) return 2;
if (opendoor == 2) return 1;
}
}

//__________________________________________________________________________
function tally_results() {

// Tally the results (add one to the appropriate tally variable).

// keep track of how many times the prize was behind each door
if (prize == 1) tally_prize_behind_door_1++;
if (prize == 2) tally_prize_behind_door_2++;
if (prize == 3) tally_prize_behind_door_3++;

// keep track of how many times the contestant chose each door
if (choice == 1) tally_initial_choice_door_1++;
if (choice == 2) tally_initial_choice_door_2++;
if (choice == 3) tally_initial_choice_door_3++;

// keep track of how many times each door was opened
if (opendoor == 1) tally_opened_door_1++;
if (opendoor == 2) tally_opened_door_2++;
if (opendoor == 3) tally_opened_door_3++;

// keep track of how many times each door was offered to switch to
if (switch_choice == 1) tally_switched_to_door_1++;
if (switch_choice == 2) tally_switched_to_door_2++;
if (switch_choice == 3) tally_switched_to_door_3++;

// keep track of wins if contestant never switches
if (choice == prize) never_switch_wins++;
if (choice != prize) never_switch_losses++;

// keep track of wins if contestant always switches
if (switch_choice == prize) always_switch_wins++;
if (switch_choice != prize) always_switch_losses++;

}

//__________________________________________________________________________
function display_results() {

document.getElementById("dr1").innerHTML = tally_prize_behind_door_1;
document.getElementById("dr2").innerHTML = tally_prize_behind_door_2;
document.getElementById("dr3").innerHTML = tally_prize_behind_door_3;

document.getElementById("ch1").innerHTML = tally_initial_choice_door_1;
document.getElementById("ch2").innerHTML = tally_initial_choice_door_2;
document.getElementById("ch3").innerHTML = tally_initial_choice_door_3;

document.getElementById("op1").innerHTML = tally_opened_door_1;
document.getElementById("op2").innerHTML = tally_opened_door_2;
document.getElementById("op3").innerHTML = tally_opened_door_3;

document.getElementById("sw1").innerHTML = tally_switched_to_door_1;
document.getElementById("sw2").innerHTML = tally_switched_to_door_2;
document.getElementById("sw3").innerHTML = tally_switched_to_door_3;

document.getElementById("nsw").innerHTML = never_switch_wins;
document.getElementById("nsl").innerHTML = never_switch_losses;
document.getElementById("asw").innerHTML = always_switch_wins;
document.getElementById("asl").innerHTML = always_switch_losses;

}
```