Implementeu rand12() utilitzant rand6() en una línia

Donada una funció rand6() que retorna nombres aleatoris de l'1 al 6 amb la mateixa probabilitat, implementeu la funció d'una línia rand12() utilitzant rand6() que retorna nombres aleatoris de l'1 al 12 amb la mateixa probabilitat. La solució hauria de minimitzar el nombre de trucades al mètode rand6(). No es permet l'ús de cap altra funció de biblioteca i l'aritmètica de coma flotant.

La idea és utilitzar l'expressió rand6() + (rand6() % 2) * 6 . Retorna nombres aleatoris de l'1 al 12 amb la mateixa probabilitat. L'expressió equival a -

 // if rand6() is even if (rand6() % 2) return 6 + rand6(); else // if rand6() is odd return rand6();  

També podem utilitzar qualsevol de les expressions següents que funcionin de manera similar:

  • rand6() + !(rand6() % 2) * 6 o
  • rand6() + (rand6() i 1) * 6 o
  • rand6() + !(rand6() i 1) * 6

A continuació es mostra la implementació de l'enfocament anterior:

C++
   #include         // for rand and srand   #include         // for time   #include          using     namespace     std  ;   // Function that returns random numbers from 1 to 6 with   // equal probability   int     rand6  ()   {      // rand() will generate random numbers between 0 and      // RAND_MAX with equal probability rand() % 6 returns      // number from 0 to 5 with equal probability (rand() %      // 6) + 1 returns number from 1 to 6 with equal      // probability      return     (  rand  ()     %     6  )     +     1  ;   }   // The function uses rand6() to return random numbers from 1   // to 12 with equal probability   int     rand12  ()     {     return     rand6  ()     +     (  rand6  ()     %     2  )     *     6  ;     }   // Driver code to test above functions   int     main  ()   {      // Initialize random number generator      srand  (  time  (  NULL  ));      int     N     =     12  ;      int     freq  [  N     +     1  ]     =     {     0     };      // call rand12() multiple times and store its results      for     (  int     i     =     0  ;     i      <     N     *     100000  ;     i  ++  )      freq  [  rand12  ()]  ++  ;      // print frequency of numbers 1-12      for     (  int     i     =     1  ;     i      <=     N  ;     i  ++  )      cout      < <     freq  [  i  ]      < <     ' '  ;      return     0  ;   }   
Java
   import     java.util.Random  ;   public     class   RandomNumbers     {      public     static     int     rand6  ()     {      Random     random     =     new     Random  ();      //nextInt(6) generates a random number from 0 to 5      return     random  .  nextInt  (  6  )     +     1  ;      }      public     static     int     rand12  ()     {      return     rand6  ()     +     (  rand6  ()     %     2  )     *     6  ;      }      public     static     void     main  (  String  []     args  )     {      int     N     =     12  ;      int  []     freq     =     new     int  [  N     +     1  ]  ;      // Initialize random number generator      Random     random     =     new     Random  ();      // Call rand12() multiple times and store its results      for     (  int     i     =     0  ;     i      <     N     *     100000  ;     i  ++  )     {      freq  [  rand12  ()  ]++  ;      }      // Print the frequency of numbers 1-12      for     (  int     i     =     1  ;     i      <=     N  ;     i  ++  )     {      System  .  out  .  print  (  freq  [  i  ]     +     ' '  );      }      }   }   
Python
   import   random   # Create a single instance of Random for better performance   rand   =   random  .  Random  ()   # Function that returns random numbers from 1 to 6 with equal probability   def   rand6  ():   return   rand  .  randint  (  1     6  )   # The function uses rand6() to return random numbers from 1 to 12 with equal probability   def   rand12  ():   return   rand6  ()   +   (  rand6  ()   %   2  )   *   6   # Driver code to test above functions   if   __name__   ==   '__main__'  :   N   =   12   iterations   =   100000   freq   =   [  0  ]   *   (  N   +   1  )   # call rand12() multiple times and store its results   for   _   in   range  (  iterations  ):   freq  [  rand12  ()]   +=   1   # print frequency of numbers 1-12   for   i   in   range  (  1     N   +   1  ):   print   freq  [  i  ]   # Wait for user input to keep the console window open   try  :   raw_input  (  'Press Enter to exit'  )   except   EOFError  :   pass   
C#
   using     System  ;   class     Program   {      // Create a single instance of Random for better performance      static     Random     rand     =     new     Random  ();      // Function that returns random numbers from 1 to 6 with equal probability      static     int     Rand6  ()      {      return     rand  .  Next  (  1       7  );      }      // The function uses Rand6() to return random numbers from 1 to 12 with equal probability      static     int     Rand12  ()      {      return     Rand6  ()     +     (  Rand6  ()     %     2  )     *     6  ;      }      // Driver code to test above functions      static     void     Main  ()      {      int     N     =     12  ;      int     iterations     =     100000  ;      int  []     freq     =     new     int  [  N     +     1  ];      // call Rand12() multiple times and store its results      for     (  int     i     =     0  ;     i      <     iterations  ;     i  ++  )      freq  [  Rand12  ()]  ++  ;      // print frequency of numbers 1-12      for     (  int     i     =     1  ;     i      <=     N  ;     i  ++  )      Console  .  Write  (  freq  [  i  ]     +     ' '  );      Console  .  ReadLine  ();     // Added to keep the console window open until a key is pressed      }   }   
JavaScript
   function     rand6  ()     {      // Generates a random number from 1 to 6      return     Math  .  floor  (  Math  .  random  ()     *     6  )     +     1  ;   }   function     rand12  ()     {      return     rand6  ()     +     (  rand6  ()     %     2  )     *     6  ;   }   const     N     =     12  ;   const     freq     =     new     Array  (  N     +     1  ).  fill  (  0  );   // Call rand12() multiple times and store its results   for     (  let     i     =     0  ;     i      <     N     *     100000  ;     i  ++  )     {      freq  [  rand12  ()]  ++  ;   }   // Print the frequency of numbers 1-12   for     (  let     i     =     1  ;     i      <=     N  ;     i  ++  )     {      console  .  log  (  freq  [  i  ]);   }   

Sortida:

 100237 100202 99678 99867 100253 99929 100287 100449 99827 99298 100019 99954   

Una altra solució:

 int rand12() { return (rand6() * 2) - (rand6() & 1); }  
  • rand6() * 2: Això tornarà els nombres parells 2 4 6 8 10 i 12 amb la mateixa probabilitat i
  • rand6() i 1 : Això tornarà 0 o 1 basat en rand6() és parell o senar respectivament. Així l'expressió
  • (rand6() * 2) - (rand6() i 1) : Això retornarà nombres aleatoris de l'1 al 12 amb la mateixa probabilitat.

A continuació es mostra la implementació de l'enfocament anterior:

C++
   #include         #include         #include          // Assume rand6 generates a random integer between 1 and 6   int     rand6  ()     {      return     rand  ()     %     6     +     1  ;   }   int     rand12  ()     {      return     (  rand6  ()     *     2  )     -     (  rand6  ()     &     1  );   }   int     main  ()     {      // Seed the random number generator      srand  (  time  (  0  ));      // Generate a random number between 1 and 12      int     randomNum     =     rand12  ();      // Print the random number      std  ::  cout      < <     'Random number between 1 and 12: '      < <     randomNum      < <     std  ::  endl  ;      return     0  ;   }   
Java
   import     java.util.Random  ;   public     class   Main     {      private     static     final     Random     rand     =     new     Random  ();      // Assume rand6 generates a random integer between 1 and 6      public     static     int     rand6  ()     {      return     rand  .  nextInt  (  6  )     +     1  ;      }      public     static     int     rand12  ()     {      return     (  rand6  ()     *     2  )     -     (  rand6  ()     &     1  );      }      public     static     void     main  (  String  []     args  )     {      // Generate a random number between 1 and 12      int     randomNum     =     rand12  ();      // Print the random number      System  .  out  .  println  (  'Random number between 1 and 12: '     +     randomNum  );      }   }   
Python
   import   random   def   rand6  ():      '''    Generates a random integer between 1 and 6 inclusive.    Returns:    int: A random integer between 1 and 6.    '''   return   random  .  randint  (  1     6  )   def   rand12  ():      '''    Generates a random integer between 1 and 12 inclusive.    Returns:    int: A random integer between 1 and 12.    '''   # Generate two random numbers between 1 and 6   num1   =   rand6  ()   num2   =   rand6  ()   # Calculate the result using the formula: (2 * num1) - (num2 & 1)   result   =   (  2   *   num1  )   -   (  num2   &   1  )   # Ensure the result is within the range of 1 to 12   if   result   >   12  :   result   =   result   %   12   return   result   if   __name__   ==   '__main__'  :   # Seed the random number generator   random  .  seed  ()   # Generate a random number between 1 and 12   random_num   =   rand12  ()   # Print the random number   print  (  'Random number between 1 and 12:'     random_num  )   
JavaScript
   /**    * Generates a random integer between 1 and 6 inclusive.    *    * @returns {number} A random integer between 1 and 6.    */   function     rand6  ()     {      return     Math  .  floor  (  Math  .  random  ()     *     6  )     +     1  ;   }   /**    * Generates a random integer between 1 and 12 inclusive.    *    * @returns {number} A random integer between 1 and 12.    */   function     rand12  ()     {      // Generate two random numbers between 1 and 6      let     num1     =     rand6  ();      let     num2     =     rand6  ();      // Calculate the result using the formula: (2 * num1) - (num2 & 1)      let     result     =     (  2     *     num1  )     -     (  num2     %     2  );      // Ensure the result is within the range of 1 to 12      if     (  result     >     12  )     {      result     =     result     %     12  ;      if     (  result     ===     0  )     {      result     =     12  ;      }      }      return     result  ;   }   // Generate a random number between 1 and 12   let     randomNum     =     rand12  ();   // Print the random number   console  .  log  (  'Random number between 1 and 12:'       randomNum  );   

Sortida
Random number between 1 and 12: 7