# Implement rand12() using rand6() in one line

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.