Related Articles
Implement rand12() using rand6() in one line
• Difficulty Level : Medium
• Last Updated : 20 Aug, 2016

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.

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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 –

 `// C++ Program to print random numbers from 1 to 12``// with equal probability using a function that returns``// random numbers from 1 to 6 with equal probability``#include ``using` `namespace` `std;`` ` `// Function that returns random numbers from 1 to 6``// with equal probability``int` `rand6()``{``    ``// rand() will generate random numbers between 0 and``    ``// RAND_MAX with equal probability``    ``// rand() % 6 returns number from 0 to 5 equal probability``    ``// (rand() % 6) + 1 returns number from 1 to 6 with``    ``// equal probability``    ``return` `(``rand``() % 6) + 1;``}`` ` `// The function uses rand6() to return random numbers``// from 1 to 12 with equal probability``int` `rand12()``{``    ``return` `rand6() + (rand6() % 2) * 6;``}`` ` `// Driver code to test above functions``int` `main()``{``    ``// Initialize random number generator``    ``srand``(``time``(NULL));``    ``int` `N = 12;`` ` `    ``int` `freq[N + 1] = { 0 };`` ` `    ``// call rand12() multiple times and store its results``    ``for` `(``int` `i = 0; i < N * 100000; i++)``        ``freq[rand12()]++;`` ` `    ``// print frequency of numbers 1-12``    ``for` `(``int` `i = 1; i <= N; i++)``        ``cout << freq[i] << ``" "``;`` ` `    ``return` `0;``}`

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.