logo

Implemente rand12() usando rand6() em uma linha

Dada uma função rand6() que retorna números aleatórios de 1 a 6 com igual probabilidade, implemente a função de uma linha rand12() usando rand6() que retorna números aleatórios de 1 a 12 com igual probabilidade. A solução deve minimizar o número de chamadas ao método Rand6(). O uso de qualquer outra função de biblioteca e aritmética de ponto flutuante não é permitido.

A ideia é usar expressão rand6() + (rand6() % 2) * 6 . Ele retorna números aleatórios de 1 a 12 com igual probabilidade. A expressão é equivalente a -



// if rand6() is even if (rand6() % 2) return 6 + rand6(); else // if rand6() is odd return rand6();

Também podemos usar qualquer uma das expressões abaixo que funcione de maneira semelhante -

  • rand6() + !(rand6() % 2) * 6 ou
  • rand6() + (rand6() & 1) * 6 ou
  • rand6() + !(rand6() & 1) * 6

Abaixo está a implementação da abordagem acima:

C++
#include  // for rand and srand #include  // for time #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 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; } 
Java
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] + ' ');  }  } } 
Python
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 
C#
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  } } 
JavaScript
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]); } 

Saída:



100237 100202 99678 99867 100253 99929 100287 100449 99827 99298 100019 99954 

Outra solução:

int rand12() { return (rand6() * 2) - (rand6() & 1); }
  • rand6() * 2: Isso retornará números pares 2 4 6 8 10 e 12 com igual probabilidade e
  • rand6() & 1 : Isso retornará 0 ou 1 com base em Rand6() é par ou ímpar, respectivamente. Então a expressão
  • (rand6() * 2) - (rand6() e 1) : Isso retornará números aleatórios de 1 a 12 com igual probabilidade.

Abaixo está a implementação da abordagem acima:

C++
#include  #include  #include    // 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; } 
Java
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);  } } 
Python
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) 
JavaScript
/**  * 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); 

Saída
Random number between 1 and 12: 7