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