📜  使用rand2()实现rand3()

📅  最后修改于: 2021-05-04 13:40:26             🧑  作者: Mango

给定一个函数rand2()以相等的概率返回0或1,请使用rand2()实现以相等的概率返回0、1或2的rand3()。最小化对rand2()方法的调用次数。同样,不允许使用任何其他库函数和浮点运算。

这个想法是使用表达式2 * rand2()+ rand2() 。它以相等的概率返回0、1、2、3。为了使它以相等的概率返回0、1、2,我们消除了不希望的事件3。
以下是上述想法的实现–

C++
// C++ Program to print 0, 1 or 2 with equal
// probability
#include 
using namespace std;
 
// Random Function to that returns 0 or 1 with
// equal probability
int rand2()
{
    // 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 0, 1 or 2 with
// equal probability 1 with 75%
int rand3()
{
    // returns 0, 1, 2 or 3 with 25% probability
    int r = 2 * rand2() + rand2();
     
    if (r < 3)
        return r;
     
    return rand3();
}
 
// Driver code to test above functions
int main()
{
    // Initialize random number generator
    srand(time(NULL));
  
    for(int i = 0; i < 100; i++)
        cout << rand3();
  
    return 0;
}


Java
// Java Program to print 0, 1 or 2 with equal 
// probability
import java.util.Random;
class GFG
{
 
  // Random Function to that returns 0 or 1 with
  // equal probability
  static int rand2()
  {
 
    // 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.
    Random rand = new Random(); 
    return (rand.nextInt() & 1);
  }
 
  // Random Function to that returns 0, 1 or 2 with 
  // equal probability 1 with 75%
  static int rand3()
  {
 
    // returns 0, 1, 2 or 3 with 25% probability
    int r = 2 * rand2() + rand2();
 
    if (r < 3)
      return r;
    return rand3();
  }
 
  // Driver code
  public static void main(String[] args) {
    for(int i = 0; i < 100; i++)
      System.out.print(rand3());
  }
}
// This code is contributed by divyesh072019.


Python3
# Python3 Program to print 0, 1 or 2 with equal
# Probability
 
import random
# Random Function to that returns 0 or 1 with
# equal probability
 
def rand2():
 
    # randint(0,100) function will generate odd or even
    # number [1,100] with equal probability. If rand()
    # generates odd number, the function will
    # return 1 else it will return 0
    tmp=random.randint(1,100)
    return tmp%2
     
# Random Function to that returns 0, 1 or 2 with
# equal probability 1 with 75%
def rand3():
     
    # returns 0, 1, 2 or 3 with 25% probability
    r = 2 * rand2() + rand2()
    if r<3:
        return r
    return rand3()
     
# Driver code to test above functions
if __name__=='__main__':
    for i in range(100):
        print(rand3(),end="")
         
#This code is contributed by sahilshelangia


C#
// C# Program to print 0, 1 or 2 with equal 
// probability
using System;
class GFG
{
 
  // Random Function to that returns 0 or 1 with
  // equal probability
  static int rand2()
  {
 
    // 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.
    Random rand = new Random();
    return (rand.Next() & 1);
  }
 
  // Random Function to that returns 0, 1 or 2 with 
  // equal probability 1 with 75%
  static int rand3()
  {
 
    // returns 0, 1, 2 or 3 with 25% probability
    int r = 2 * rand2() + rand2();
 
    if (r < 3)
      return r;
    return rand3();
  }
 
  // Driver code
  static void Main()
  {
    for(int i = 0; i < 100; i++)
      Console.Write(rand3());
  }
}
 
// This code is contributed by divyeshrabadiya07.


PHP


输出 :

2111011101112002111002020210112022022022211100100121202021102100010200121121210122011022111020

另一个解决方案–
如果x = rand2()和y = rand2(),则x + y将以25%的概率返回0和2,以50%的概率返回1。为了使1的概率等于0和2的概率(即25%),我们消除了一个导致x + y = 1的不期望事件,即(x = 1,y = 0)或(x = 0,y = 1) 。

int rand3()
{
    int x, y;

    do {
        x = rand2();
        y = rand2();
    } while (x == 0 && y == 1);

    return x + y;
}