Genera 0 y 1 con 25% y 75% de probabilidad

Dada una función rand50() que devuelve 0 o 1 con la misma probabilidad, escriba una función que devuelva 1 con un 75% de probabilidad y 0 con un 25% de probabilidad usando rand50() únicamente. Minimiza el número de llamadas al método rand50(). Tampoco se permite el uso de ninguna otra función de biblioteca ni la aritmética de punto flotante.

La idea es utilizar O bit a bit . Un OR bit a bit toma dos bits y devuelve 0 si ambos bits son 0, mientras que en caso contrario el resultado es 1. Por lo tanto, tiene un 75% de probabilidad de que devuelva 1.

A continuación se muestra la implementación de la idea anterior:

C++
   // Program to print 1 with 75% probability and 0   // with 25% probability   #include          using     namespace     std  ;   // Random Function to that returns 0 or 1 with   // equal probability   int     rand50  ()   {      // rand() function will generate odd or even      // number with equal probability. If rand()      // generates odd number the function will      // return 1 else it will return 0.      return     rand  ()     &     1  ;   }   // Random Function to that returns 1 with 75%   // probability and 0 with 25% probability using   // Bitwise OR   bool     rand75  ()   {      return     rand50  ()     |     rand50  ();   }   // Driver code to test above functions   int     main  ()   {      // Initialize random number generator      srand  (  time  (  NULL  ));      for  (  int     i     =     0  ;     i      <     50  ;     i  ++  )      cout      < <     rand75  ();      return     0  ;   }   
Java
   // Java program to print 1 with 75% probability and 0    // with 25% probability    class   GFG      {      // Random Function to that returns 0 or 1 with       // equal probability       static     int     rand50  ()      {      // rand() function will generate odd or even       // number with equal probability. If rand()       // generates odd number the function will       // return 1 else it will return 0.       return     (  int  )     (  10     *     Math  .  random  ())     &     1  ;      }      // Random Function to that returns 1 with 75%       // probability and 0 with 25% probability using       // Bitwise OR       static     int     rand75  ()      {      return     rand50  ()     |     rand50  ();      }      // Driver code       public     static     void     main  (  String  []     args  )      {      // Initialize random number generator       //srand(time(null));       for     (  int     i     =     0  ;     i      <     50  ;     i  ++  )      {      System  .  out  .  print  (  rand75  ());      }      }   }   // This code is contributed by 29AjayKumar   
Python3
   # Program to print 1 with 75% probability and 0   # with 25% probability   from   random   import   randrange   # Random Function to that returns 0 or 1 with   # equal probability   def   rand50  ():   # The randrange function will generate integer   # between the half closed interval at end   # Here by passing parameter as 02   # the function will generate integer between 0 and 1   return   (  int  )(  randrange  (  0     2  ))   &   1   # Random Function to that returns 1 with 75%   # probability and 0 with 25% probability using   # Bitwise OR   def   rand75  ():   return   rand50  ()   |   rand50  ()   # Driver code to test above functions   for   i   in   range  (  0     50  ):   print  (  rand75  ()   end  =  ''  )   # This code is contributed by meetgor.   
C#
   // C# program to print 1 with 75% probability and 0    // with 25% probability    using     System  ;   public     class     GFG   {      // Instantiate random number generator      static     Random     rand     =     new     Random  ();          // Random Function to that returns 0 or 1 with       // equal probability       static     int     rand50  ()      {          // rand() function will generate 1 or 0       // with equal probability      return     rand  .  Next  (  0       2  );      }      // Random Function to that returns 1 with 75%       // probability and 0 with 25% probability using       // Bitwise OR       static     int     rand75  ()      {      return     rand50  ()     |     rand50  ();      }      public     static     void     Main  (  string  []     args  )      {      for     (  int     i     =     0  ;     i      <     50  ;     i  ++  )      {      Console  .  Write  (  rand75  ());      }      }   }   //this code is contributed by phasing17   
PHP
      // Program to print 1 with 75% probability   // and 0 with 25% probability   // Random Function to that returns 0 or   // 1 with equal probability   function   rand50  ()   {   // rand() function will generate    // odd or even number with equal   // probability. If rand() generates   // odd number the function will   // return 1 else it will return 0.   return   rand  ()   &   1  ;   }   // Random Function to that returns   // 1 with 75% probability and 0    // with 25% probability using   // Bitwise OR   function   rand75  ()   {   return   rand50  ()   |   rand50  ();   }   // Driver Code   // Initialize random    // number generator   srand  (  time  (  NULL  ));   for  (  $i   =   0  ;   $i    <   50  ;   $i  ++  )   echo   rand75  ();   // This code is contributed m_kit   ?>   
JavaScript
    <  script  >   // Program to print 1 with 75% probability and 0   // with 25% probability   // Random Function to that returns 0 or 1 with   // equal probability   function     rand50  ()     {      // rand() function will generate odd or even      // number with equal probability. If rand()      // generates odd number the function will      // return 1 else it will return 0.      return     Math  .  floor  (  Math  .  random  ()     *     10  )     &     1  ;   }   // Random Function to that returns 1 with 75%   // probability and 0 with 25% probability using   // Bitwise OR   function     rand75  ()     {      return     rand50  ()     |     rand50  ();   }   // Driver code to test above functions   // Initialize random number generator   for     (  let     i     =     0  ;     i      <     50  ;     i  ++  )      document  .  write  (  rand75  ());   // This code is contributed by gfgking    <  /script>   

Producción
11101010110101011010000101011110100010111110101111 

Complejidad del tiempo: O(1)
Espacio Auxiliar: O(1)


En líneas similares también podemos usar Bit a bit Y . Como devuelve 0 con un 75% de probabilidad, tenemos que invertir el resultado.

// Random Function to that returns 1 with 75% // probability and 0 with 25% probability using // Bitwise AND bool rand75() { return !(rand50() & rand50()); } 

A continuación se muestra la implementación de la idea anterior:

C++
   #include          using     namespace     std  ;       // Random Function to that returns 0 or 1 with   // equal probability   int     rand50  ()   {      // rand() function will generate odd or even      // number with equal probability. If rand()      // generates odd number the function will      // return 1 else it will return 0.      return     rand  ()     &     1  ;   }       // Random Function to that returns 1 with 75%   // probability and 0 with 25% probability using   // Bitwise AND   bool     rand75  ()   {      return     !  (  rand50  ()     &     rand50  ());   }       // Driver code to test above functions   int     main  ()   {      // Initialize random number generator      srand  (  time  (  NULL  ));          for  (  int     i     =     0  ;     i      <     50  ;     i  ++  )      cout      < <     rand75  ();          return     0  ;   }   
Java
   class   GFG   {      // Random Function to that returns 0 or 1 with      // equal probability      static     int     rand50  ()      {      // rand() function will generate odd or even      // number with equal probability. If rand()      // generates odd number the function will      // return 1 else it will return 0.      return     (  int  )     (  10     *     Math  .  random  ())     &     1  ;      }          // Random Function to that returns 1 with 75%      // probability and 0 with 25% probability using      // Bitwise AND      static     int     rand75  ()      {      return     (  rand50  ()     &     rand50  ())  ^  1  ;      }          // Driver code      public     static     void     main  (  String  []     args  )      {      // Initialize random number generator      //srand(time(null));          for     (  int     i     =     0  ;     i      <     50  ;     i  ++  )      {      System  .  out  .  print  (  rand75  ());      }          }       }   
Python3
   from   random   import   randrange   # Random Function to that returns 0 or 1 with   # equal probability   def   rand50  ():   return   ((  int  )(  randrange  (  0     2  ))   &   1  )   def   rand75  ():   return   (  rand50  ()   &   rand50  ())  ^  1   for   i   in   range  (  0     50  ):   print  (  rand75  ()   end  =  ''  )   
C#
   // C# program to implement the approach   using     System  ;   class     GFG      {      // Random Function to that returns 0 or 1 with      // equal probability      static     int     rand50  ()      {      // Instantiate random number generator using      // system-supplied value as seed.      var     rand     =     new     Random  ();      // rand() function will generate 0 or 1      // number with equal probability.      return     rand  .  Next  (  0       2  );      }      // Random Function to that returns 1 with 75%      // probability and 0 with 25% probability using      // Bitwise AND      static     int     rand75  ()      {      return     (  rand50  ()     &     rand50  ())     ^     1  ;      }      // Driver code      public     static     void     Main  (  string  []     args  )      {          // Initialize random number generator      // srand(time(null));      for     (  int     i     =     0  ;     i      <     50  ;     i  ++  )     {      Console  .  Write  (  rand75  ());      }      }   }   // This code is contributed by phasing17   
JavaScript
   // JavaScript program to implement the approach   // Random Function to that returns 0 or 1 with   // equal probability   function     rand50  ()   {      return     (  Math  .  floor  (  Math  .  random  ()     *     2  )     &     1  );   }      function     rand75  ()   {      return     (  rand50  ()     &     rand50  ())  ^  1  ;   }       for     (  var     i     =     0  ;     i      <     50  ;     i  ++  )      process  .  stdout  .  write  (  rand75  ().  toString  ());           //This code is contributed by phasing17   

Producción
11111111000111101111110011111110011110111111010111 

Podemos reemplazar los operadores Bitwise OR y Bitwise AND con Operadores O y Y también - 

// Random Function to that returns 1 with 75% // probability and 0 with 25% probability using // OR or AND operator int rand75() { return !(rand50() && rand50()); // return rand50() || rand50() } 

También podemos lograr el resultado usando el operador de desplazamiento a la izquierda y Bitwise XOR

C++
   // Program to print 1 with 75% probability and 0   // with 25% probability   #include          using     namespace     std  ;   // Random Function to that returns 0 or 1 with   // equal probability   int     rand50  ()   {      // rand() function will generate odd or even      // number with equal probability. If rand()      // generates odd number the function will      // return 1 else it will return 0.      return     rand  ()     &     1  ;   }   // Random Function to that returns 1 with 75%   // probability and 0 with 25% probability using   // left shift and Bitwise XOR   int     rand75  ()   {      // x is one of {0 1}      int     x     =     rand50  ();      x     =     x      < <     1  ;      // x is now one of {00 10}      x     =     x     ^     rand50  ();      // x is now one of {00 01 10 11}      return     (  x     >     0  )     ?     1     :     0  ;   }   // Driver code to test above functions   int     main  ()   {      // Initialize random number generator      srand  (  time  (  NULL  ));      for     (  int     i     =     0  ;     i      <     50  ;     i  ++  )      cout      < <     rand75  ();      return     0  ;   }   
Java
   // Java program to print 1 with 75% probability and 0   // with 25% probability   class   GFG   {   // Random Function to that returns 0 or 1 with   // equal probability   static     int     rand50  ()   {      // rand() function will generate odd or even      // number with equal probability. If rand()      // generates odd number the function will      // return 1 else it will return 0.      return     (  int  )     (  10     *     Math  .  random  ())     &     1  ;   }   // Random Function to that returns 1 with 75%   // probability and 0 with 25% probability using   // left shift and Bitwise XOR   static     int     rand75  ()   {      // x is one of {0 1}      int     x     =     rand50  ();      x     =     x      < <     1  ;      // x is now one of {00 10}      x     =     x     ^     rand50  ();      // x is now one of {00 01 10 11}      return     (  x     >     0  )     ?     1     :     0  ;   }   // Driver code   public     static     void     main  (  String  []     args  )   {      for     (  int     i     =     0  ;     i      <     50  ;     i  ++  )      System  .  out  .  print  (  rand75  ());   }   }   // This code is contributed by 29AjayKumar   
Python3
   # Program to print 1 with 75% probability and 0   # with 25% probability   from   random   import   randrange   # Random Function to that returns 0 or 1 with   # equal probability   def   rand50  ():   # rand range function generates a integer between   # the provided ranges which is half closed interval   # It will generate integer 0 or 1 if passed 02 as parameter   return   (  int  )(  randrange  (  0     2  ))   &   1   # Random Function to that returns 1 with 75%   # probability and 0 with 25% probability using   # left shift and Bitwise XOR   def   rand75  ():   # x is one of {0 1}   x   =   rand50  ()   x   =   x    < <   1   # x is now one of {00 10}   x   =   x   ^   rand50  ()   # x is now one of {00 01 10 11}   return   1   if   (  x   >   0  )   else   0   # Driver code to test above functions   for   i   in   range  (  0     50  ):   print  (  rand75  ()   end  =  ''  )   # This code is contributed by meetgor.   
C#
   // C# program to print 1 with 75% probability and 0   // with 25% probability   using     System  ;   public     class     GFG   {          // Random Function to that returns 0 or 1 with      // equal probability      static     Random     rnd     =     new     Random  ();      static     int     rand50  ()      {          // Next(2) will generate 0 or 1 with equal probability      return     rnd  .  Next  (  2  );      }          // Random Function to that returns 1 with 75%      // probability and 0 with 25% probability using      // left shift and Bitwise XOR      static     int     rand75  ()      {          // x is one of {0 1}      int     x     =     rand50  ();          x     =     x      < <     1  ;          // x is now one of {00 10}      x     =     x     ^     rand50  ();          // x is now one of {00 01 10 11}      return     (  x     >     0  )     ?     1     :     0  ;      }          static     public     void     Main     (){      for     (  int     i     =     0  ;     i      <     50  ;     i  ++  )      Console  .  Write  (  rand75  ());      }   }   // This code is contributed by shruti456rawal   
PHP
      // Program to print 1 with    // 75% probability and 0   // with 25% probability   // Random Function to that    // returns 0 or 1 with   // equal probability   function   rand50  ()   {   // rand() function will    // generate odd or even    // number with equal    // probability. If rand()    // generates odd number    // the function will return   // 1 else it will return 0.   return   rand  ()   &   1  ;   }   // Random Function to that    // returns 1 with 75%    // probability and 0 with   // 25% probability using   // left shift and Bitwise XOR   function   rand75  ()   {   // x is one of {0 1}   $x   =   rand50  ();   $x   =   $x    < <   1  ;   // x is now one   // of {00 10}   $x   =   $x   ^   rand50  ();   // x is now one of   // {00 01 10 11}   return   (  $x   >   0  )   ?   1   :   0  ;   }   // Driver code    // Initialize random   // number generator   srand  (  time  (  NULL  ));   for   (  $i   =   0  ;   $i    <   50  ;   $i  ++  )   echo   rand75  ();   // This code is contributed    // by ajit   ?>   
JavaScript
    <  script  >   // Javascript program to print 1 with 75% probability and 0   // with 25% probability      // Random Function to that returns 0 or 1 with      // equal probability   function     rand50  ()   {      // rand() function will generate odd or even      // number with equal probability. If rand()      // generates odd number the function will      // return 1 else it will return 0.      return     Math  .  floor  ((  10     *     Math  .  random  ()))     &     1  ;   }      // Random Function to that returns 1 with 75%      // probability and 0 with 25% probability using      // Bitwise OR   function     rand75  ()   {      // x is one of {0 1}      let     x     =     rand50  ();          x     =     x      < <     1  ;          // x is now one of {00 10}          x     =     x     ^     rand50  ();          // x is now one of {00 01 10 11}          return     (  x     >     0  )     ?     1     :     0  ;   }   // Driver code   for     (  let     i     =     0  ;     i      <     50  ;     i  ++  )   {      document  .  write  (  rand75  ());   }   // This code is contributed by rag2127    <  /script>       

Producción
10110100111011011110111100101111110111100001111111 

Complejidad del tiempo: O(1)
Espacio Auxiliar: O(1)

Tenga en cuenta que las soluciones anteriores producirán diferentes resultados cada vez que los ejecutamos.