Implémentez rand12() en utilisant rand6() sur une seule ligne
Étant donné une fonction rand6() qui renvoie des nombres aléatoires de 1 à 6 avec une probabilité égale, implémentez la fonction monoligne rand12() en utilisant rand6() qui renvoie des nombres aléatoires de 1 à 12 avec une probabilité égale. La solution doit minimiser le nombre d’appels à la méthode rand6(). L'utilisation de toute autre fonction de bibliothèque et l'arithmétique à virgule flottante ne sont pas autorisées.
L'idée est d'utiliser l'expression rand6() + (rand6() % 2) * 6 . Il renvoie des nombres aléatoires de 1 à 12 avec une probabilité égale. L'expression équivaut à -
// if rand6() is even if (rand6() % 2) return 6 + rand6(); else // if rand6() is odd return rand6();Nous pouvons également utiliser l'une des expressions ci-dessous qui fonctionne de la même manière :
- rand6() + !(rand6() % 2) * 6 ou
- rand6() + (rand6() & 1) * 6 ou
- rand6() + !(rand6() & 1) * 6
Vous trouverez ci-dessous la mise en œuvre de l’approche ci-dessus :
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 ]); }
Sortir:
100237 100202 99678 99867 100253 99929 100287 100449 99827 99298 100019 99954Une autre solution :
int rand12() { return (rand6() * 2) - (rand6() & 1); }
- rand6() * 2 : Cela renverra les nombres pairs 2 4 6 8 10 et 12 avec une probabilité égale et
- rand6() & 1 : Cela renverra 0 ou 1 basé sur rand6() qui est respectivement pair ou impair. Donc l'expression
- (rand6() * 2) - (rand6() & 1) : Cela renverra des nombres aléatoires de 1 à 12 avec une probabilité égale.
Vous trouverez ci-dessous la mise en œuvre de l’approche ci-dessus :
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 );
Sortir
Random number between 1 and 12: 7