Given a function rand6() that returns random numbers from 1 to 6 with equal probability, implement one-liner function rand12() using rand6() that returns random numbers from 1 to 12 with equal probability. Solution should minimize the number of calls to rand6() method. Use of any other library function and floating point arithmetic are not allowed.
The idea is to use expression
rand6() + (rand6() % 2) * 6
. It returns random numbers from 1 to 12 with equal probability. The expression is equivalent to –
// if rand6() is even
if (rand6() % 2)
return 6 + rand6();
else // if rand6() is odd
return rand6();
We can also use any one of below expressions that works in a similar way –
- rand6() + !(rand6() % 2) * 6 or
- rand6() + (rand6() & 1) * 6 or
- rand6() + !(rand6() & 1) * 6
Below is C++ implementation of above idea –
CPP
#include <iostream>
using namespace std;
int rand6()
{
return ( rand () % 6) + 1;
}
int rand12()
{
return rand6() + (rand6() % 2) * 6;
}
int main()
{
srand ( time (NULL));
int N = 12;
int freq[N + 1] = { 0 };
for ( int i = 0; i < N * 100000; i++)
freq[rand12()]++;
for ( int i = 1; i <= N; i++)
cout << freq[i] << " ";
return 0;
}
|
Java
import java.util.Random;
public class RandomNumbers {
public static int rand6() {
Random random = new Random();
return random.nextInt( 6 ) + 1 ;
}
public static int rand12() {
return rand6() + (rand6() % 2 ) * 6 ;
}
public static void main(String[] args) {
int N = 12 ;
int [] freq = new int [N + 1 ];
Random random = new Random();
for ( int i = 0 ; i < N * 100000 ; i++) {
freq[rand12()]++;
}
for ( int i = 1 ; i <= N; i++) {
System.out.print(freq[i] + " " );
}
}
}
|
C#
using System;
class Program
{
static Random rand = new Random();
static int Rand6()
{
return rand.Next(1, 7);
}
static int Rand12()
{
return Rand6() + (Rand6() % 2) * 6;
}
static void Main()
{
int N = 12;
int iterations = 100000;
int [] freq = new int [N + 1];
for ( int i = 0; i < iterations; i++)
freq[Rand12()]++;
for ( int i = 1; i <= N; i++)
Console.Write(freq[i] + " " );
Console.ReadLine();
}
}
|
Javascript
function rand6() {
return Math.floor(Math.random() * 6) + 1;
}
function rand12() {
return rand6() + (rand6() % 2) * 6;
}
const N = 12;
const freq = new Array(N + 1).fill(0);
for (let i = 0; i < N * 100000; i++) {
freq[rand12()]++;
}
for (let i = 1; i <= N; i++) {
console.log(freq[i]);
}
|
Output:
100237 100202 99678 99867 100253 99929 100287 100449 99827 99298 100019 99954
Another Solution –
int rand12()
{
return (rand6() * 2) - (rand6() & 1);
}
rand6() * 2
will return even numbers 2, 4, 6, 8, 10 and 12 with equal probability and
rand6() & 1
will return 0 or 1 based on rand6() is even or odd respectively. So, the expression
(rand6() * 2) – (rand6() & 1)
will return random numbers from 1 to 12 with equal probability.
Please note above solutions will produce different results every time we run them.
If you like GeeksforGeeks and would like to contribute, you can also write an article using
write.geeksforgeeks.org
or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
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!