Implemente random-0-6-Generator usando el random-0-1-Generator dado

Dada una función random01Generator() que le da al azar 0 o 1, implemente una función que utilice esta función y genere números entre 0 y 6 (ambos inclusive). Todos los números deben tener las mismas probabilidades de ocurrencia.

Ejemplos:

on multiple runs, it gives 
3
2
3
6
0

Enfoque: La idea aquí es encontrar el rango del número más pequeño mayor que el rango dado. Aquí, dado que el rango es 6, decida que 2^3 es el número más pequeño mayor que 6. Por lo tanto, aquí k será 3.

Entonces, intente formar un número binario de 3 caracteres cada vez y una vez que obtenga los 3 caracteres, busque la representación decimal correspondiente de ese número binario y devuelva ese valor.

Por ejemplo, si da 0 en la primera llamada random01, luego 1 en la siguiente llamada y finalmente 1 nuevamente en la siguiente llamada, se puede decir que el número binario así formado es 011, que es la representación decimal del número 3 y, por lo tanto, devuelve 3. Si en caso de que dé 111, que es 7 que está fuera de rango. Entonces, simplemente descarte este número y repita todo el proceso nuevamente hasta que dé el número en el rango requerido.

Al llamar a random01Generator() 6 veces, la probabilidad de ocurrencia de números no será la misma. Por ejemplo, por primera vez, la probabilidad de ocurrencia de 0 es 1/2. Ahora, por segunda vez, nuevamente la probabilidad es 1/2, lo que hace que la probabilidad total sea 1/4. Si este proceso se repite 6 veces llamando a la función aleatoria 6 veces, la probabilidad de ocurrencia de 0 será 1/(2^6). Del mismo modo, la probabilidad de ocurrencia de 1 será mayor que la de 0, la de 2 será mayor que 1 y así sucesivamente, siguiendo el patrón de distribución binomial.

Hacer lo anterior garantizará que todas las probabilidades sean iguales, ya que solo se considera el rango en el que se pueden generar esos números y se rechaza cualquier caso que nos dé un resultado mayor que el rango máximo especificado. Por lo tanto, el enfoque anterior.

Obviamente, esta idea se puede extender, si hay algún otro generador aleatorio, digamos random0mGenerator() y es necesario generar un número entre 0 y n, donde n>m. En este caso, modifique la siguiente función para incorporar m y n.

Requisitos previos: BigInteger en Java.

Java

// Java code to generate random numbers
import java.math.BigInteger;
import java.util.Random;
  
public class RandomImp{
      
    public int random01Generator() {
  
        Random rand = new Random();
        return rand.nextInt(2); 
    }
  
    // function will use the above
    // method and return numbers 
    // between 0 and 6 inclusive.
    public void random06Generator(){
  
        Random rand = new Random();
        int val = 7;
        while (val >= 7) {
  
            String res = "";
            for (int i = 0; i < 3; i++) 
                res += 
                 String.valueOf(random01Generator());            
  
            BigInteger bg = new BigInteger(res,2);
                         
            val = bg.intValue();
        }
          
        System.out.println(val);
    }
      
    // Driver Code
    public static void main(String[] args){
        RandomImp r = new RandomImp();
        r.random06Generator();
    }
}

Producción :

3
2
4
1

Esta pregunta está inspirada en este enlace de stackoverflow

Publicación traducida automáticamente

Artículo escrito por Ashish Kumar 15 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 *