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