Implement rand3() using rand2()
Given a function rand2() that returns 0 or 1 with equal probability, implement rand3() using rand2() that returns 0, 1 or 2 with equal probability. Minimize the number of calls to rand2() method. Also, use of any other library function and floating point arithmetic are not allowed.
The idea is to use expression 2 * rand2() + rand2(). It returns 0, 1, 2, 3 with equal probability. To make it return 0, 1, 2 with equal probability, we eliminate the undesired event 3.
Below is the implementation of above idea –
C++
#include <iostream>
using namespace std;
int rand2()
{
return rand () & 1;
}
int rand3()
{
int r = 2 * rand2() + rand2();
if (r < 3)
return r;
return rand3();
}
int main()
{
srand ( time (NULL));
for ( int i = 0; i < 100; i++)
cout << rand3();
return 0;
}
|
Java
import java.util.Random;
class GFG
{
static int rand2()
{
Random rand = new Random();
return (rand.nextInt() & 1 );
}
static int rand3()
{
int r = 2 * rand2() + rand2();
if (r < 3 )
return r;
return rand3();
}
public static void main(String[] args) {
for ( int i = 0 ; i < 100 ; i++)
System.out.print(rand3());
}
}
|
Python3
import random
def rand2():
tmp = random.randint( 1 , 100 )
return tmp % 2
def rand3():
r = 2 * rand2() + rand2()
if r< 3 :
return r
return rand3()
if __name__ = = '__main__' :
for i in range ( 100 ):
print (rand3(),end = "")
|
C#
using System;
class GFG
{
static int rand2()
{
Random rand = new Random();
return (rand.Next() & 1);
}
static int rand3()
{
int r = 2 * rand2() + rand2();
if (r < 3)
return r;
return rand3();
}
static void Main()
{
for ( int i = 0; i < 100; i++)
Console.Write(rand3());
}
}
|
PHP
<?php
function rand2()
{
return rand() & 1;
}
function rand3()
{
$r = 2 * rand2() + rand2();
if ( $r < 3)
return $r ;
return rand3();
}
srand(time(NULL));
for ( $i = 0; $i < 100; $i ++)
echo rand3();
?>
|
Javascript
<script>
function rand2()
{
return Math.floor(Math.random()*2);
}
function rand3()
{
var r = 2 * rand2() + rand2();
if (r < 3)
return r;
return rand3();
}
var ans = "" ;
for ( var i = 0; i < 100; i++)
ans += rand3();
document.write(ans);
</script>
|
Output :
2111011101112002111002020210112022022022211100100121202021102100010200121121210122011022111020
Another Solution –
If x = rand2() and y = rand2(), x + y will return 0 and 2 with 25% probability and 1 with 50% probability. To make probability of 1 equal to that of 0 and 2 i.e. 25%, we eliminate one undesired event that’s resulting in x + y = 1 i.e. either (x = 1, y = 0) or (x = 0, y = 1).
int rand3()
{
int x, y;
do {
x = rand2();
y = rand2();
} while (x == 0 && y == 1);
return x + y;
}
Please note above solutions will produce different results every time we run them.
Last Updated :
09 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...