logo

rand2()를 사용하여 rand3() 구현

동일한 확률로 0 또는 1을 반환하는 함수 rand2()가 주어지면 동일한 확률로 0 1 또는 2를 반환하는 rand2()를 사용하여 rand3()을 구현합니다. rand2() 메서드 호출 횟수를 최소화하세요. 또한 다른 라이브러리 함수 및 부동 소수점 연산의 사용은 허용되지 않습니다.
 


아이디어는 표현을 사용하는 것입니다 2 * 랜드2() + 랜드2() . 동일한 확률로 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(0100) function will generate odd or even # number [1100] with equal probability. If rand() # generates odd number the function will  # return 1 else it will return 0 tmp=random.randint(1100) 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
 // PHP Program to print 0 1 or  // 2 with equal probability // Random Function to that  // returns 0 or 1 with // equal probability function 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% function rand3() { // returns 0 1 2 or 3  // with 25% probability $r = 2 * rand2() + rand2(); if ($r < 3) return $r; return rand3(); } // Driver Code // Initialize random  // number generator srand(time(NULL)); for($i = 0; $i < 100; $i++) echo rand3(); // This code is contributed by aj_36 ?> 
JavaScript
<script>  // Javascript program to print 0 1 or 2 with equal   // probability    // Random Function to that returns 0 or 1 with  // equal probability  function rand2()  {    // Math.random()*2 function generates   // 0 and 1 with equal probability  return Math.floor(Math.random()*2);  }    // Random Function to that returns 0 1 or 2 with   // equal probability 1 with 75%  function rand3()  {    // returns 0 1 2 or 3 with 25% probability  var r = 2 * rand2() + rand2();    if (r < 3)  return r;  return rand3();  }    var ans = ''; //to store the output  for(var i = 0; i < 100; i++)  ans += rand3();    document.write(ans);    // This code is contributed by shruti456rawal </script> 

출력 :  
 

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


위의 솔루션은 실행할 때마다 다른 결과를 생성합니다.