/*
* Monty Hall problem simulation
*
* Matt Bishop, ECS 36A
* -- May 27, 2024 original version(s) done
* -- May 28, 2024 finished in class
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/random.h>
/*
* macros
*/
#define NUM_GAMES 1000000 /* default number of games */
/*
* generate a number between 1 and 3 inclusive
* we only need 1 random byte, hence the unsigned char
* getrandom should either return the byte or fail
*/
int gen_door(void)
{
unsigned char rn = 0; /* space for random byte */
/* generate a random byte */
if (getrandom(&rn, sizeof(unsigned char), GRND_NONBLOCK) == -1){
perror("getrandom");
exit(1);
}
/* map it into 1, 2, or 3 and return it */
return(rn % 3 + 1);
}
int main(int argc, char *argv[])
{
int i; /* counter in a for loop */
char *ends; /* points to 1 beyond end of argv[1] */
int prize_door; /* door behind which prize lies */
int door_before_switch; /* door contestant picks */
int number_games; /* how many games to play */
int win_switch = 0; /* how many games switching doors won */
int win_noswitch = 0; /* how many games not switching doors won */
/*
* check there are either 0 or 1 arguments
* and process them
*/
if (argc > 2){
fprintf(stderr, "Usage: %s [ number of games ]\n", argv[0]);
return(1);
}
else if (argc == 2){
number_games = strtol(argv[1], &ends, 10);
if (*ends != '\0' || number_games < 1){
fprintf(stderr, "%s: need positive integer\n", argv[1]);
return(1);
}
}
else{ /* argc == 1 */
number_games = NUM_GAMES;
}
/*
* now play the games
*/
for(i = 0; i < number_games; i++){
prize_door = gen_door(); /* generate the door for the prize */
door_before_switch = gen_door(); /* generate door contestant chose */
/* now see whether switching wins */
if (door_before_switch == prize_door){
/* for not switching */
win_noswitch++;
}
else{
/* for switching */
win_switch++;
}
}
/*
* announce results
*/
printf("Won %d (%f%%) games where we switched\n",
win_switch, (double) win_switch / (double) number_games);
printf("Won %d (%f%%) games where we did not switch\n",
win_noswitch, (double) win_noswitch / (double) number_games);
return(0);
}
|
ECS 36A, Programming & Problem Solving Version of April 2, 2024 at 12:13PM
|
You can get the raw source code here. |