Реализуйте rand3 () с помощью rand2 ()

Опубликовано: 20 Января, 2022

Учитывая функцию rand2 (), которая возвращает 0 или 1 с равной вероятностью, реализуйте rand3 () с помощью rand2 (), которая возвращает 0, 1 или 2 с равной вероятностью. Минимизируйте количество вызовов метода rand2 (). Также запрещено использование любых других библиотечных функций и арифметических операций с плавающей запятой.

Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.

The idea is to use expression 2 * rand2() + rand2(). It returns 0, 1, 2, 3 with equal probability. To make it return 0, 1, 2 with equal probability, we eliminate the undesired event 3.
Below is the implementation of above idea – 
 

C++

// C++ Program to print 0, 1 or 2 with equal
// probability
#include <iostream>
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

<?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
?>

Выход :

 2111011101112002111002020210112022022022211100100121202021102100010200121121210122011022111020

Другое решение -
Если x = rand2 () и y = rand2 (), x + y вернет 0 и 2 с вероятностью 25% и 1 с вероятностью 50%. Чтобы сделать вероятность 1 равной вероятности 0 и 2, то есть 25%, мы устраняем одно нежелательное событие, которое приводит к x + y = 1, т.е. либо (x = 1, y = 0), либо (x = 0, y = 1) .

 int rand3 ()
{
    int x, y;

    делать {
        х = ранд2 ();
        у = rand2 ();
    } while (x == 0 && y == 1);

    вернуть x + y;
}

Обратите внимание, что приведенные выше решения будут давать разные результаты каждый раз, когда мы их запускаем.
Эта статья предоставлена Адитьей Гоэлем . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью на сайте deposit.geeksforgeeks.org или отправить свою статью по электронной почте: grant@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.

РЕКОМЕНДУЕМЫЕ СТАТЬИ