C++: Monty Hall Problem

Bjarne-stroustrup
 


Run random simulations of the Monty Hall game. Show the effects of a strategy of the contestant always keeping his first guess so it can be contrasted with the strategy of the contestant always switching his guess.

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. The car and the goats were placed randomly behind the doors before the show. The rules of the game show are as follows: After you have chosen a door, the door remains closed for the time being. The game show host, Monty Hall, who knows what is behind the doors, now has to open one of the two remaining doors, and the door he opens must have a goat behind it. If both remaining doors have goats behind them, he chooses one randomly. After Monty Hall opens a door with a goat, he will ask you to decide whether you want to stay with your first choice or to switch to the last remaining door. Imagine that you chose Door 1 and the host opens Door 3, which has a goat. He then asks you “Do you want to switch to Door Number 2?” Is it to your advantage to change your choice? (Krauss and Wang 2003:10)

Note that the player may initially choose any of the three doors (not just Door 1), that the host opens a different door revealing a goat (not necessarily Door 3), and that he gives the player a second choice between the two remaining unopened doors.

Simulate at least a thousand games using three doors for each strategy and show the results in such a way as to make it easy to compare the effects of each strategy.

#include <iostream>
#include <cstdlib>
#include <ctime>

int randint(int n)
{
	return (1.0*n*std::rand())/(1.0+RAND_MAX);
}

int other(int doorA, int doorB)
{
	int doorC;
	if (doorA == doorB)
	{
		doorC = randint(2);
		if (doorC >= doorA)
		++doorC;
	}
	else
	{
		for (doorC = 0; doorC == doorA || doorC == doorB; ++doorC)
		{
			// empty
		}
	}
	return doorC;
}

int check(int games, bool change)
{
	int win_count = 0;
	for (int game = 0; game < games; ++game)
	{
		int const winning_door = randint(3);
		int const original_choice = randint(3);
		int open_door = other(original_choice, winning_door);

		int const selected_door = change?
		other(open_door, original_choice)
		: original_choice;

		if (selected_door == winning_door)
		++win_count;
	}

	return win_count;
}

int main()
{
	std::srand(std::time(0));

	int games = 10000;
	int wins_stay = check(games, false);
	int wins_change = check(games, true);
	std::cout << "staying: " << 100.0*wins_stay/games << "%, changing: " << 100.0*wins_change/games << "%\n";
}

Sample output:

staying: 33.73%, changing: 66.9%

SOURCE

Content is available under GNU Free Documentation License 1.2.