Dada una función rand6() que devuelve números aleatorios del 1 al 6 con la misma probabilidad, implemente la función de una línea rand12() usando rand6() que devuelve números aleatorios del 1 al 12 con la misma probabilidad. La solución debería minimizar el número de llamadas al método rand6(). No se permite el uso de ninguna otra función de biblioteca ni la aritmética de punto flotante.
La idea es usar la expresión rand6() + (rand6() % 2) * 6 . Devuelve números aleatorios del 1 al 12 con igual probabilidad. La expresión es equivalente a –
// if rand6() is even if (rand6() % 2) return 6 + rand6(); else // if rand6() is odd return rand6();
También podemos usar cualquiera de las siguientes expresiones que funcionan de manera similar:
- rand6() + !(rand6() % 2) * 6 o
- rand6() + (rand6() & 1) * 6 o
- rand6() + !(rand6() & 1) * 6
A continuación se muestra la implementación en C++ de la idea anterior:
// C++ Program to print random numbers from 1 to 12 // with equal probability using a function that returns // random numbers from 1 to 6 with equal probability #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 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; }
Producción:
100237 100202 99678 99867 100253 99929 100287 100449 99827 99298 100019 99954
Otra solución –
int rand12() { return (rand6() * 2) - (rand6() & 1); }
rand6() * 2 devolverá los números pares 2, 4, 6, 8, 10 y 12 con la misma probabilidad y rand6() & 1 devolverá 0 o 1 en función de que rand6() sea par o impar respectivamente. Entonces, la expresión (rand6() * 2) – (rand6() & 1) devolverá números aleatorios del 1 al 12 con la misma probabilidad.
Tenga en cuenta que las soluciones anteriores producirán resultados diferentes cada vez que las ejecutemos.
Este artículo es una contribución de Aditya Goel . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA