Implement rand12() using rand6() in one line

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.
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 <iostream>using namespace std;  // Function that returns random numbers from 1 to 6// with equal probabilityint 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 probabilityint rand12(){    return rand6() + (rand6() % 2) * 6;}  // Driver code to test above functionsint 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.
This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@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.
Randomized
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
K'th Smallest/Largest Element in Unsorted Array | Set 2 (Expected Linear Time)
Shuffle a given array using Fisher–Yates shuffle Algorithm
Shuffle or Randomize a list in Java
Generating Random String Using PHP
Estimating the value of Pi using Monte Carlo
Operations on Sparse Matrices
Reservoir Sampling
Expected Number of Trials until Success
Shuffle a deck of cards
Randomized Binary Search Algorithm