Implémentez rand12() en utilisant rand6() sur une seule ligne

Étant donné une fonction rand6() qui renvoie des nombres aléatoires de 1 à 6 avec une probabilité égale, implémentez la fonction monoligne rand12() en utilisant rand6() qui renvoie des nombres aléatoires de 1 à 12 avec une probabilité égale. La solution doit minimiser le nombre d’appels à la méthode rand6(). L'utilisation de toute autre fonction de bibliothèque et l'arithmétique à virgule flottante ne sont pas autorisées.

L'idée est d'utiliser l'expression rand6() + (rand6() % 2) * 6 . Il renvoie des nombres aléatoires de 1 à 12 avec une probabilité égale. L'expression équivaut à -

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

Nous pouvons également utiliser l'une des expressions ci-dessous qui fonctionne de la même manière :

  • rand6() + !(rand6() % 2) * 6 ou
  • rand6() + (rand6() & 1) * 6 ou
  • rand6() + !(rand6() & 1) * 6

Vous trouverez ci-dessous la mise en œuvre de l’approche ci-dessus :

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  ]);   }   

Sortir:

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

Une autre solution :

 int rand12() { return (rand6() * 2) - (rand6() & 1); }  
  • rand6() * 2 : Cela renverra les nombres pairs 2 4 6 8 10 et 12 avec une probabilité égale et
  • rand6() & 1 : Cela renverra 0 ou 1 basé sur rand6() qui est respectivement pair ou impair. Donc l'expression
  • (rand6() * 2) - (rand6() & 1) : Cela renverra des nombres aléatoires de 1 à 12 avec une probabilité égale.

Vous trouverez ci-dessous la mise en œuvre de l’approche ci-dessus :

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  );   

Sortir
Random number between 1 and 12: 7