Programa Java para implementar el algoritmo de generación de números aleatorios de Park-Miller

El generador de números aleatorios de Park-Miller también se conoce como generador de números aleatorios de Lehmer . Una fórmula general de un generador de números aleatorios (RNG) de este tipo es, X k+1 = a * x k mod m

 

Algoritmo de Park-Miller

1) Declare las variables m, a, q, r y r_seed(X 0 ) como variables constantes y asigne 

m = 2145678965L;
a = 48271L;
q = 44488L;
r = 3399L;
r_seed = 12345678L

Aquí, el valor de las constantes m y r_seed se eligen de tal manera que el GCD(m, r_seed) = 1 . La X 0 m

2) Declarar la función uniforme con doble como tipo de retorno.

     2.1) Declarar variable hi, lo, t.

     2.2) establezca las variables hi, lo, t de la siguiente manera: 

              2.2.1) hi= como semilla dividida por b

              2.2.2) lo = semilla – b * hola

              2.2.3) t = a * bajo – c * alto

Donde hi y li son los números más altos y más bajos en un rango, respectivamente, para un número aleatorio para m y r_seed (X 0 ) en particular.

     2.3) comprobar si (t > 0) es decir; el número aleatorio generado es positivo, luego establezca   r_seed = t .

     2.4) si no establece r_seed = t + m . // el numero aleatorio generado es negativo

     2.5) devolver la semilla del uniforme de función.

3) En el método principal

     3.1) Iniciar un bucle de i=0 a 10

             3.1.1) Llame a la función aleatoria y almacene los resultados para cada iteración.

     3.2) Imprimir los resultados

5) Fin

Ejemplo: El siguiente programa implementa el algoritmo de generación de números aleatorios de Park-Miller.

Nota: Cada iteración de este código producirá una salida diferente.

Java

// Java implementation of Park-Miller algorithm
  
public class Park_Miller_Random_Numbers {
  
    // m is coprime to seed r_seed
    static final long m = 2147483647L;
  
    // constants
    static final long a = 48271L;
    static final long q = 44488L;
    static final long r = 3399L;
  
    // take a r_seed that is coprime to m
    static long r_seed = 12345678L;
  
    public static double uniform()
    {
        // highest and lowest for
        // a random number generation
        // range
        long hi = r_seed / q;
        long lo = r_seed - q * hi;
  
        // calculate random number
        long t = a * lo - r * hi;
  
        // if positive
        if (t > 0)
            r_seed = t;
        else
            r_seed = t + m;
        return r_seed;
    }
  
    public static void main(String[] argv)
    {
        double[] A = new double[10];
  
        for (int i = 0; i < 5; i++)
            A[i] = uniform();
  
        for (int i = 0; i < 5; i++)
            System.out.print("  " + A[i]);
    }
}
Producción

  1.085252519E9  5.08259731E8  1.352291773E9  1.563240271E9  8.90733155E8

Publicación traducida automáticamente

Artículo escrito por Gunjanpaul 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 *