logo

Rand12()'yi Rand6() kullanarak tek satırda uygulayın

Eşit olasılıkla 1'den 6'ya kadar rastgele sayılar döndüren bir rand6() işlevi verildiğinde, eşit olasılıkla 1'den 12'ye kadar rastgele sayılar döndüren rand6()'yı kullanarak tek satırlık rand12() işlevini uygulayın. Çözüm, Rand6() yöntemine yapılan çağrı sayısını en aza indirmelidir. Başka herhangi bir kütüphane fonksiyonunun ve kayan nokta aritmetiğinin kullanımına izin verilmez.

Fikir ifadeyi kullanmaktır Rand6() + (rand6() % 2) * 6 . Eşit olasılıkla 1'den 12'ye kadar rastgele sayılar döndürür. İfade şuna eşdeğerdir:



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

Benzer şekilde çalışan aşağıdaki ifadelerden herhangi birini de kullanabiliriz:

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

Yukarıdaki yaklaşımın uygulanması aşağıdadır:

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]); } 

Çıkış:



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

Başka Bir Çözüm:

int rand12() { return (rand6() * 2) - (rand6() & 1); }
  • Rand6() * 2: Bu, eşit olasılıkla 2 4 6 8 10 ve 12 çift sayılarını döndürecektir ve
  • Rand6() ve 1 : Bu, Rand6()'nın çift veya tek olmasına bağlı olarak sırasıyla 0 veya 1 değerini döndürecektir. Yani ifade
  • (rand6() * 2) - (rand6() & 1) : Bu, eşit olasılıkla 1'den 12'ye kadar rastgele sayılar döndürecektir.

Yukarıdaki yaklaşımın uygulanması aşağıdadır:

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); 

Çıkış
Random number between 1 and 12: 7