/* * 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. |