Listing 1

#include <stdio.h>

#define BIT_MASK      7
#define NO_DOORS      3.0
#define RANDFACTOR    (32768.0 * (1.0/NO_DOORS))

main()
{

   int i, n, car, choice, open, count;

   unsigned char u[2], doors, noprize, mask, not_open,
             not_choice;

   double prob;

   srand(1);

   do {

      fprintf(stderr,
       "\nHow many games of not-switching, and switching would you like?: ");
      scanf("%d", &n);

      printf("\n\nNumber of trials in this series is %d\n",
           n);

      /* LOOP IN WHICH CONTESTANT DOES NOT SWITCH */

      for(count=i=0; i<n; i++) {

         doors = 1;

         /* get a random number between 0 and 2 to hide
           car behind door # */

         car = (int)((double)rand()/RANDFACTOR);

         doors <<= car;             /* status of doors */

         noprize = ~doors & BIT_MASK; /* doors with goats */

          /* contestant picks a door */

          choice = (int)((double)rand()/RANDFACTOR);

          /* host reveals a door which is not 'choice'
             and not 'car' (a goat!) */

          mask = noprize & ((~(1 << choice)) & BIT_MASK);

          /* host always picks first one not satisfying
             condition */

          open = 0;
          while(!(mask & 1)) {
             mask >>= 1;
             open++;
          }

          if(choice == car) count++;

          /* since the contestant did not switch, 'choice'
             does not depend on 'open'! */

      }

      prob = (double)count/(double)n;

      printf(
       "\nPercentage of wins for non-switching is %.1f",
           prob * 100.0);

/* LOOP IN WHICH CONTESTANT SWITCHES CHOICE */

      for(count=i=0; i<n; i++) {

        doors = 1;

       /* get a random number between 0 and 2 to hide car
         behind door # */

         car = (int)((double)rand()/RANDFACTOR);

         doors <<= car;             /* status of doors */

         noprize = ~doors & BIT_MASK; /* doors with goats */

         /* contestant picks a door */

         choice = (int)((double)rand()/RANDFACTOR);

         /* host reveals a door which is not 'choice' and not
           'car' */

         mask = noprize & ((~(1 << choice)) & BIT_MASK);

         open = 0;
         while(!(mask & 1)) {
            mask >>= 1;
            open++;
         }

       /* now the contestant switches to door which is not
          'choice' and not 'open' */

         not_choice = ~(1 << choice) & BIT_MASK;
         not_open   = ~(1 << open)   & BIT_MASK;

         choice = not_open & not_choice;

        /* if switched choice = original status of 'doors'
          it's a "win"! */

         if(choice == doors) count++;

      }

      prob = (double)count/(double)n;

      printf("\nPercentage of wins for switching is %.1f\n",
           prob * 100.0);
      printf("\n- - - - - - - - - - - - - - - - - - - - - \
---\n");

      fprintf(stderr, "\nPlay Again?: ");
      scanf("%s", u);

   }
   while(toupper(*u) == 'Y');

}

/* End of File */