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.24
So 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++
#include <bits/stdc++.h>
using namespace std;
int foo()
{
}
int my_fun()
{
int val1 = foo();
int val2 = foo();
if (val1 == 0 && val2 == 1)
return 0;
if (val1 == 1 && val2 == 0)
return 1;
return my_fun();
}
int main()
{
cout << my_fun();
return 0;
}
|
C
#include <stdio.h>
int foo()
{
}
int my_fun()
{
int val1 = foo();
int val2 = foo();
if (val1 == 0 && val2 == 1)
return 0;
if (val1 == 1 && val2 == 0)
return 1;
return my_fun();
}
int main()
{
printf ( "%d " , my_fun());
return 0;
}
|
Java
import java.io.*;
class GFG {
static int foo()
{
}
static int my_fun()
{
int val1 = foo();
int val2 = foo();
if (val1 == 0 && val2 == 1 )
return 0 ;
if (val1 == 1 && val2 == 0 )
return 1 ;
return my_fun();
}
public static void main(String[] args)
{
System.out.println(my_fun());
}
}
|
Python3
def foo():
pass
def my_fun():
val1, val2 = foo(), foo()
if val1 ^ val2:
return val1
return my_fun()
if __name__ = = '__main__' :
print (my_fun())
|
C#
using System;
class GFG {
static int foo()
{
}
static int my_fun()
{
int val1 = foo();
int val2 = foo();
if (val1 == 0 && val2 == 1)
return 0;
if (val1 == 1 && val2 == 0)
return 1;
return my_fun();
}
static public void Main() { Console.Write(my_fun()); }
}
|
PHP
<?php
function foo()
{
}
function my_fun()
{
$val1 = foo();
$val2 = foo();
if ( $val1 == 0 && $val2 == 1)
return 0;
if ( $val1 == 1 && $val2 == 0)
return 1;
return my_fun();
}
echo my_fun();
?>
|
Javascript
<script>
function foo()
{
}
function my_fun()
{
var val1 = foo();
var val2 = foo();
if (val1 == 0 && val2 == 1)
return 0;
if (val1 == 1 && val2 == 0)
return 1;
return my_fun();
}
document.write(my_fun());
</script>
|
Time Complexity: O(1)
Auxiliary Space: O(1)
References:
http://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin
This 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.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
10 Sep, 2021
Like Article
Save Article