Implement rand12() using rand6() in one line
Last Updated :
08 Jul, 2024
Improve
Given a function, rand6() that returns random numbers from 1 to 6 with equal probability, implement the one-liner function rand12() using rand6() which returns random numbers from 1 to 12 with equal probability. The solution should minimize the number of calls to the 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 the below expressions that works in a similar way –
- rand6() + !(rand6() % 2) * 6 or
- rand6() + (rand6() & 1) * 6 or
- rand6() + !(rand6() & 1) * 6
Below is the implementation of the above approach:
#include <cstdlib> // for rand and srand
#include <ctime> // for time
#include <iostream>
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 with 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;
}
import java.util.Random;
public class RandomNumbers {
public static int rand6() {
Random random = new Random();
//nextInt(6) generates a random number from 0 to 5
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];
// Initialize random number generator
Random random = new Random();
// Call rand12() multiple times and store its results
for (int i = 0; i < N * 100000; i++) {
freq[rand12()]++;
}
// Print the frequency of numbers 1-12
for (int i = 1; i <= N; i++) {
System.out.print(freq[i] + " ");
}
}
}
import random
# Create a single instance of Random for better performance
rand = random.Random()
# Function that returns random numbers from 1 to 6 with equal probability
def rand6():
return rand.randint(1, 6)
# The function uses rand6() to return random numbers from 1 to 12 with equal probability
def rand12():
return rand6() + (rand6() % 2) * 6
# Driver code to test above functions
if __name__ == "__main__":
N = 12
iterations = 100000
freq = [0] * (N + 1)
# call rand12() multiple times and store its results
for _ in range(iterations):
freq[rand12()] += 1
# print frequency of numbers 1-12
for i in range(1, N + 1):
print freq[i],
# Wait for user input to keep the console window open
try:
raw_input("Press Enter to exit")
except EOFError:
pass
using System;
class Program
{
// Create a single instance of Random for better performance
static Random rand = new Random();
// Function that returns random numbers from 1 to 6 with equal probability
static int Rand6()
{
return rand.Next(1, 7);
}
// The function uses Rand6() to return random numbers from 1 to 12 with equal probability
static int Rand12()
{
return Rand6() + (Rand6() % 2) * 6;
}
// Driver code to test above functions
static void Main()
{
int N = 12;
int iterations = 100000;
int[] freq = new int[N + 1];
// call Rand12() multiple times and store its results
for (int i = 0; i < iterations; i++)
freq[Rand12()]++;
// print frequency of numbers 1-12
for (int i = 1; i <= N; i++)
Console.Write(freq[i] + " ");
Console.ReadLine(); // Added to keep the console window open until a key is pressed
}
}
function rand6() {
// Generates a random number from 1 to 6
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);
// Call rand12() multiple times and store its results
for (let i = 0; i < N * 100000; i++) {
freq[rand12()]++;
}
// Print the frequency of numbers 1-12
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: This will return even numbers 2, 4, 6, 8, 10 and 12 with equal probability and
- rand6() & 1: This will return 0 or 1 based on rand6() is even or odd respectively. So, the expression
- (rand6() * 2) – (rand6() & 1): This will return random numbers from 1 to 12 with equal probability.
Below is the implementation of the above approach:
#include <cstdlib>
#include <ctime>
#include <iostream>
// Assume rand6 generates a random integer between 1 and 6
int rand6() {
return rand() % 6 + 1;
}
int rand12() {
return (rand6() * 2) - (rand6() & 1);
}
int main() {
// Seed the random number generator
srand(time(0));
// Generate a random number between 1 and 12
int randomNum = rand12();
// Print the random number
std::cout << "Random number between 1 and 12: " << randomNum << std::endl;
return 0;
}
import java.util.Random;
public class Main {
private static final Random rand = new Random();
// Assume rand6 generates a random integer between 1 and 6
public static int rand6() {
return rand.nextInt(6) + 1;
}
public static int rand12() {
return (rand6() * 2) - (rand6() & 1);
}
public static void main(String[] args) {
// Generate a random number between 1 and 12
int randomNum = rand12();
// Print the random number
System.out.println("Random number between 1 and 12: " + randomNum);
}
}
import random
def rand6():
"""
Generates a random integer between 1 and 6, inclusive.
Returns:
int: A random integer between 1 and 6.
"""
return random.randint(1, 6)
def rand12():
"""
Generates a random integer between 1 and 12, inclusive.
Returns:
int: A random integer between 1 and 12.
"""
# Generate two random numbers between 1 and 6
num1 = rand6()
num2 = rand6()
# Calculate the result using the formula: (2 * num1) - (num2 & 1)
result = (2 * num1) - (num2 & 1)
# Ensure the result is within the range of 1 to 12
if result > 12:
result = result % 12
return result
if __name__ == "__main__":
# Seed the random number generator
random.seed()
# Generate a random number between 1 and 12
random_num = rand12()
# Print the random number
print("Random number between 1 and 12:", random_num)
/**
* Generates a random integer between 1 and 6, inclusive.
*
* @returns {number} A random integer between 1 and 6.
*/
function rand6() {
return Math.floor(Math.random() * 6) + 1;
}
/**
* Generates a random integer between 1 and 12, inclusive.
*
* @returns {number} A random integer between 1 and 12.
*/
function rand12() {
// Generate two random numbers between 1 and 6
let num1 = rand6();
let num2 = rand6();
// Calculate the result using the formula: (2 * num1) - (num2 & 1)
let result = (2 * num1) - (num2 % 2);
// Ensure the result is within the range of 1 to 12
if (result > 12) {
result = result % 12;
if (result === 0) {
result = 12;
}
}
return result;
}
// Generate a random number between 1 and 12
let randomNum = rand12();
// Print the random number
console.log("Random number between 1 and 12:", randomNum);
Output
Random number between 1 and 12: 7