Biorąc pod uwagę funkcję Rand2(), która zwraca 0 lub 1 z równym prawdopodobieństwem, zaimplementuj Rand3() za pomocą Rand2(), która zwraca 0 1 lub 2 z równym prawdopodobieństwem. Zminimalizuj liczbę wywołań metody Rand2(). Niedozwolone jest także używanie innych funkcji bibliotecznych i arytmetyki zmiennoprzecinkowej.
Chodzi o to, aby użyć wyrażenia 2 * Rand2() + Rand2() . Zwraca 0 1 2 3 z równym prawdopodobieństwem. Aby zwrócić 0 1 2 z równym prawdopodobieństwem, eliminujemy niepożądane zdarzenie 3.
Poniżej realizacja powyższego pomysłu –
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>
Wyjście :
2111011101112002111002020210112022022022211100100121202021102100010200121121210122011022111020
Inne rozwiązanie -
Jeśli x = Rand2() i y = Rand2() x + y zwróci 0 i 2 z prawdopodobieństwem 25% i 1 z prawdopodobieństwem 50%. Aby prawdopodobieństwo 1 było równe prawdopodobieństwu 0 i 2, tj. 25%, eliminujemy jedno niepożądane zdarzenie, którego wynikiem jest x + y = 1, tj. (x = 1 y = 0) lub (x = 0 y = 1).
int rand3() { int x y; do { x = rand2(); y = rand2(); } while (x == 0 && y == 1); return x + y; }
Należy pamiętać, że powyższe rozwiązania dadzą inne wyniki za każdym razem, gdy je uruchomimy.