Make a fair coin from a biased coin

10 Sep, 2021
You are given a function foo() that represents a biased coin. When foo() is called, it returns 0 with 60% probability, and 1 with 40% probability. Write a new function that returns 0 and 1 with a 50% probability each. Your function should use only foo(), no other library method.
Solution: We know foo() returns 0 with 60% probability. How can we ensure that 0 and 1 are returned with a 50% probability? The solution is similar to this post. If we can somehow get two cases with equal probability, then we are done. We call foo() two times. Both calls will return 0 with a 60% probability. So the two pairs (0, 1) and (1, 0) will be generated with equal probability from two calls of foo(). Let us see how.(0, 1): The probability to get 0 followed by 1 from two calls of foo() = 0.6 * 0.4 = 0.24 (1, 0): The probability to get 1 followed by 0 from two calls of foo() = 0.4 * 0.6 = 0.24So the two cases appear with equal probability. The idea is to return consider only the above two cases, return 0 in one case, return 1 in other case. For other cases [(0, 0) and (1, 1)], recur until you end up in any of the above two cases. 
The below program depicts how we can use foo() to return 0 and 1 with equal probability.  
C++
C
Java
Python3
C#
PHP
Javascript
#include <bits/stdc++.h>using namespace std; int foo() // given method that returns 0          // with 60% probability and 1 with 40%{    // some code here} // returns both 0 and 1 with 50% probabilityint my_fun(){    int val1 = foo();    int val2 = foo();    if (val1 == 0 && val2 == 1)        return 0; // Will reach here with                  // 0.24 probability    if (val1 == 1 && val2 == 0)        return 1; // Will reach here with                  // 0.24 probability    return my_fun(); // will reach here with                     // (1 - 0.24 - 0.24) probability} // Driver Codeint main(){    cout << my_fun();    return 0;} // This is code is contributed// by rathbhupendra
#include <stdio.h> int foo() // given method that returns 0 with 60%          // probability and 1 with 40%{    // some code here} // returns both 0 and 1 with 50% probabilityint my_fun(){    int val1 = foo();    int val2 = foo();    if (val1 == 0 && val2 == 1)        return 0; // Will reach here with 0.24 probability    if (val1 == 1 && val2 == 0)        return 1; // // Will reach here with 0.24                  // probability    return my_fun(); // will reach here with (1 - 0.24 -                     // 0.24) probability} int main(){    printf("%d ", my_fun());    return 0;}
import java.io.*; class GFG {     // Given method that returns 0    // with 60% probability and 1 with 40%    static int foo()    {        // some code here    }     // Returns both 0 and 1 with 50% probability    static int my_fun()    {        int val1 = foo();        int val2 = foo();        if (val1 == 0 && val2 == 1)             return 0; // Will reach here with                      // 0.24 probability         if (val1 == 1 && val2 == 0)             return 1; // Will reach here with                      // 0.24 probability         return my_fun(); // will reach here with                         // (1 - 0.24 - 0.24) probability    }     // Driver Code    public static void main(String[] args)    {        System.out.println(my_fun());    }} // This code is contributed by ShubhamCoder
# Python3 program for the# above approachdef foo():       # Some code here    pass # Returns both 0 and 1# with 50% probabilitydef my_fun():       val1, val2 = foo(), foo()         if val1 ^ val2:               # Will reach here with        # (0.24 + 0.24) probability        return val1           # Will reach here with    # (1 - 0.24 - 0.24) probability    return my_fun() # Driver Codeif __name__ == '__main__':    print(my_fun()) # This code is contributed by sgshah2
using System; class GFG {     // given method that returns 0    // with 60% probability and 1 with 40%    static int foo()    {        // some code here    }     // returns both 0 and 1 with 50% probability    static int my_fun()    {        int val1 = foo();        int val2 = foo();        if (val1 == 0 && val2 == 1)            return 0; // Will reach here with                      // 0.24 probability        if (val1 == 1 && val2 == 0)            return 1; // Will reach here with                      // 0.24 probability        return my_fun(); // will reach here with                         // (1 - 0.24 - 0.24) probability    }     // Driver Code    static public void Main() { Console.Write(my_fun()); }} // This is code is contributed// by ShubhamCoder
<?php function foo()  // given method that returns 0                // with 60% probability and 1 with 40%{    // some code here} // returns both 0 and 1 with 50% probabilityfunction my_fun(){    $val1 = foo();    $val2 = foo();    if ($val1 == 0 && $val2 == 1)        return 0; // Will reach here with                  // 0.24 probability    if ($val1 == 1 && $val2 == 0)        return 1; // Will reach here with                  // 0.24 probability    return my_fun(); // will reach here with                     // (1 - 0.24 - 0.24) probability} // Driver Codeecho my_fun(); // This is code is contributed// by Akanksha Rai?>
<script> // Given method that returns 0 with// 60% probability and 1 with 40%function foo(){    // Some code here} // Returns both 0 and 1 with// 50% probabilityfunction my_fun(){    var val1 = foo();    var val2 = foo();         if (val1 == 0 && val2 == 1)        return 0; // Will reach here with                  // 0.24 probability                       if (val1 == 1 && val2 == 0)        return 1; // Will reach here with                  // 0.24 probability                       return my_fun(); // Will reach here with                     // (1 - 0.24 - 0.24) probability} // Driver Codedocument.write(my_fun()); // This code is contributed by noob2000 </script>
Time Complexity: O(1)
Auxiliary Space: O(1)
References: http://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coinThis article is compiled by Shashank Sinha and reviewed by GeeksforGeeks team. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 
rathbhupendra
Akanksha_Rai
shubhamsingh84100
sgshah2
noob2000
subhammahato348
Mathematical
Randomized
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Operators in C / C++
Prime Numbers
Sieve of Eratosthenes
Program to find GCD or HCF of two numbers
K'th Smallest/Largest Element in Unsorted Array | Set 2 (Expected Linear Time)
Shuffle a given array using Fisher–Yates shuffle Algorithm
QuickSort using Random Pivoting
Shuffle or Randomize a list in Java
Generating Random String Using PHP