使用rand2()实现rand3()

给定一个以相同概率返回0或1的函数rand2(),使用以相同概率返回0、1或2的rand2()实现rand3()。尽量减少对rand2()方法的调用次数。此外,不允许使用任何其他库函数和浮点算法。

null

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

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

请注意,上述解决方案每次运行时都会产生不同的结果。 本文由 阿迪蒂亚·戈尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享