#include #include #include int ask_user(void) { unsigned int rn; rn = 0; if (getrandom(&rn, sizeof(unsigned int), GRND_NONBLOCK) == 1){ perror("getrandom"); exit(1); } rn = rn % 3 + 1; printf("rn = %d\n", rn); return(rn); } int ask_user_yn() { int ch, i; while(printf("> "), (ch = getchar()) != EOF){ while((i = getchar()) != '\n' && i != EOF) ; if (ch == 'y' || ch == 'Y') return('y'); else if (ch == 'n' || ch == 'N') return('n'); printf("y or n please! "); } exit(1); } void set_prize_door(int *door) { printf("Select door where prize is "); if ((*door = ask_user()) == 0) exit(1); } void contestant_picks_door(int *door) { printf("Select door for contestant "); if ((*door = ask_user()) == 0) exit(1); } void monty_shows_door(int prize_door, int door_before_switch) { int sd; if (prize_door == door_before_switch) sd = (prize_door + 1) % 3; else if (door_before_switch == 1) sd = (prize_door == 2) ? 3 : 2; else if (door_before_switch == 2) sd = (prize_door == 1) ? 3 : 1; else sd = (prize_door == 2) ? 1 : 2; printf("I will show you door %d\n", sd); } void switch_or_not(int start_door, int prize_door) { printf("Does contestant switch doors? "); if (ask_user_yn() =='y'){ if (start_door != prize_door) printf("You picked door %d, and the prize is behind door %d -- you win!\n", start_door, prize_door); else printf("You picked door %d, but the prize is behind door %d -- you lose!\n", start_door, prize_door); } else{ if (start_door == prize_door) printf("You picked door %d, and the prize is behind door %d -- you win!\n", start_door, prize_door); else printf("You picked door %d, but the prize is behind door %d -- you lose!\n", start_door, prize_door); } } int main(void) { int prize_door; int door_before_switch; set_prize_door(&prize_door); contestant_picks_door(&door_before_switch); monty_shows_door(prize_door, door_before_switch); printf("prize door %d, door before switch %d\n", prize_door, door_before_switch); switch_or_not(door_before_switch, prize_door); return(0); }