Monty Hall Problem with Functions

Hello. So, I have to write a program using user defined functions that solves the Monty Hall problem. For what I did, the counts for user winning and game winning should go up based on a bool statement (win). Yet, no matter what I do to it, the bool is always returning a "false"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <iomanip>
using namespace std;

const char GOAT = 'G';
const char CAR = 'C';
bool win;
int maxTrials = 1000000000;
int userWon = 0;
int gameWon = 0;
int max = 16;

bool playGame()
{
	char door1;
        char door2;
        char door3;

	//1.0 setup the doors
	srand(time(NULL)); //seeding RGN with current time
	door1 = door2 = door3 = GOAT; //set all doors to GOAT
	switch (1 + rand() % 3) 
	{
	case 1: door1 = CAR; break;
	case 2: door2 = CAR; break;
	case 3: door3 = CAR; break;
	default: cerr<< "Bad Number in switch!!!\n";
		door1 = CAR;
	}
	

	int choice; // user choice
	choice = 1 + rand() % 3; // choice between 1 and 3
	
switch (choice) 
	{
	case 1: win = (door1 == CAR); break;
	case 2: win = (door2 == CAR); break;
	case 3: win = (door3 == CAR); break;
	}
	
return win;

}

void printTableLine(int userWon, int gameWon, int max)
{
	
	cout << setw(10) << max << setw(10) << gameWon << setw(12) << userWon  << endl;
}


int main()
{

int max = 16;

cout << setw(10) << "Number of Games" << setw(10) << " Game Wins" << setw(12) << "User Wins" << setw(20) << "Percentage of Wins" << endl;
while (max < maxTrials)
{
	int userWon = 0;
	int gameWon = 0;
	for ( int game = 0; game < max; game++)
	{
		
		
		if (playGame())
			userWon++;
		else
			gameWon++;
	
	}
	 printTableLine (userWon, gameWon, max);
		max = max + max;
}
return 0;
}
Last edited on
firstly i see an issue on line 64.
Are you trying to call your function on that line? if so it needs 3 parameters..

which is why win never changes.
Last edited on
mutexe, thanks for pointing that out, i copied over the wrong code. That was me trying random things out of frustration. this is the main exactly as my professor told us to set it up, with blank parameters for playGame. But, at that point, the compiler won't run since the parameters are blank... so that's my first problem....
So, if i put in some parameters (1, 0, 'G', 'C') doesn't matter what, it gives back a false for the first half or so trials, suddenly jumps to 50/50ish, then mostly trues...
I don't understand why you've written a function taking 3 parameters when you don't do anything with them. You just "write over" them on line 21 by setting them all to GOAT.

what you've posted now will not compile due to line 67.
Last edited on
Idk... That was just what my professor had listed for everything. broken parameter problems aside (I've removed them from both the if statement on 67 and the function itself, it still returns a false constantly.
Just 'cause I'm a sucker for playing around with game theory problems, here's my take on it. Don't know if it'll help, since you have to modify your instructor's code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
//================================================================================
// Monty.cpp
//--------------------------------------------------------------------------------
// 
//================================================================================
#include <iostream>
#include <string>
#include <ctime>

using namespace std;

const int numDoors = 4; // using 1 - 3 array indexes, 0 will be ignored


void setup( bool doors[] );
int Open( int guess, bool doors[] ); // open a door other than guess which isn't the winning door
int SwapGuess( int guess, int openDoor, bool doors[] );
int GetRand( int min, int max );
bool PlayGame( bool swap );


//================================================================================
// main()
//--------------------------------------------------------------------------------
// 
//================================================================================
int main()
{
	int games = 100000;
	double wins = 0;

	// play games without swapping
	for( int i = 0; i < games; i++ )
	{
		if( PlayGame( false ) )
			wins++;
	}
	cout << "Not swapping win %" << 100 / (games/wins) << endl;

	// play games with swapping
	wins = 0;
	for( int i = 0; i < games; i++ )
	{
		if( PlayGame( true ) )
			wins++;
	}
	cout << "Swapping win %" << 100 / (games/wins) << endl;
}


//================================================================================
// PlayGame()
//--------------------------------------------------------------------------------
// 
//================================================================================
bool PlayGame( bool swap )
{
	bool doors[numDoors];

	setup( doors );

	int guess = -1;
	guess = GetRand( 1, 3 );

	int openDoor = -1;
	openDoor = Open( guess, doors );

	if( swap )
		guess = SwapGuess( guess, openDoor, doors );

	if( doors[guess] )
		return true; // win
	else
		return false; // lose
}


//================================================================================
// setup()
//--------------------------------------------------------------------------------
// 
//================================================================================
void setup( bool doors[] )
{
	for( int i = 0; i < numDoors; i++ )
		doors[i] = false;

	doors[ GetRand( 1, numDoors-1) ] = true;
	return;
}


//================================================================================
// Open()
//--------------------------------------------------------------------------------
// Open a door other than guess which isn't the winning door
//================================================================================
int Open( int guess, bool doors[] )
{
	int d1 = -1;
	int d2 = -1;

	switch( guess )
	{
		case 1:
			d1 = 2;
			d2 = 3;
			break;
		case 2:
			d1 = 1;
			d2 = 3;
			break;
		case 3:
			d1 = 1;
			d2 = 2;
			break;
	}

	if( doors[d1] || doors[d2] ) // one of the not chosen doors has the prize
	{
		if( doors[d1] ) // door d1 has the prize, open d2
			return d2;
		else
			return d1;
	}

	// neither of the not chosen doors has the prize, open a random one
	if( GetRand( 1, 2 ) == 1 )
		return d1;
	else
		return d2;
}


//================================================================================
// SwapGuess()
//--------------------------------------------------------------------------------
// 
//================================================================================
int SwapGuess( int guess, int openDoor, bool doors[] )
{
	int newGuess = -1;
	switch( guess )
	{
		case 1:
			if( openDoor == 2 )
				newGuess = 3;
			else
				newGuess = 2;
			break;
		case 2:
			if( openDoor == 1 )
				newGuess = 3;
			else
				newGuess = 1;
			break;
		case 3:
			if( openDoor == 1 )
				newGuess = 2;
			else
				newGuess = 1;
	}
	return newGuess;
}


//================================================================================
// GetRand()                                                                   
//--------------------------------------------------------------------------------
// Return a random integer in the range of min to max                          
//================================================================================
int GetRand( int min, int max )
{
	static bool initialized = false;

	if( !initialized )
	{
		srand( time( 0 ) );
		initialized = true;
	}
	return (rand() % (max - min + 1)) + min;
}
Last edited on
So, for anyone still working on this : P
i figured out my problem. I got the problem all finished, and figured it out.
The problem here is the seed. seeding the RNG, no matter what I attempt to set the seed as, returns the problem. not seeding it creates the predicted results, but the numbers are of course always the same, which doesn't really work... Ideas?
move the srand( time( NULL ) ); line to somewhere in main() before the loop starts.
Here's the problem, the current time returned by time() only updates every millisecond or so. And believe it or not Your program is able to process many thousands, of games in that time. Since your seeding each of those games with the current time (which hasn't changed), they will all be using the same random numbers.

never seed in a loop.
AH! see, the reason i deseeded in the first place was because of that exact thought, that the time couldnt update in time, but I just couldn't think of a better idea. Let me go and check that right now.
THANK YOU! THANK YOU BOTH! haha, I am an idiot. Well, you know what they say about a fresh pair of eyes (despite neither of my colleagues being able to tell me that) thanks! runs like a charm
Topic archived. No new replies allowed.