给定一个以相同概率返回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