Implemente rand12() usando rand6() en una línea

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *