Wichmann–Hill es un generador de números pseudoaleatorios propuesto en 1982 por Brian Wichmann y David Hill. [1] Consiste en tres generadores congruenciales lineales con diferentes módulos primos , cada uno de los cuales se utiliza para producir un número distribuido uniformemente entre 0 y 1. Estos se suman, módulo 1, para producir el resultado. [2]
La suma de tres generadores produce una secuencia pseudoaleatoria con un ciclo superior6,95 × 10 12 . [3] Específicamente, los módulos son 30269, 30307 y 30323, produciendo períodos de 30268, 30306 y 30322. El período general es el mínimo común múltiplo de estos: 30268×30306×30322/4 =6 953 607 871 644. Esto ha sido confirmado por una búsqueda de fuerza bruta . [4] [5]
El siguiente pseudocódigo es para su implementación en máquinas capaces de realizar operaciones aritméticas con números enteros de hasta5.212.632 :
[r, s1, s2, s3] = function ( s1 , s2 , s3 ) es // s1, s2, s3 deben ser aleatorios de 1 a 30 000. Use el reloj si está disponible. s1 := mod(171 × s1 , 30269) s2 := mod(172 × s2 , 30307) s3 := mod(170 × s3 , 30323) r := modificación( s1 /30269.0 + s2 /30307.0 + s3 /30323.0, 1)
Para máquinas limitadas a números enteros con signo de 16 bits, el siguiente código equivalente solo usa números de hasta30,323 :
[r, s1, s2, s3] = function ( s1 , s2 , s3 ) es // s1, s2, s3 deben ser aleatorios de 1 a 30 000. Use el reloj si está disponible. s1 := 171 × mod( s1 , 177) − 2 × floor( s1 / 177) s2 := 172 × mod( s2 , 176) − 35 × floor( s2 / 176) s3 := 170 × mod( s3 , 178) − 63 × floor( s3 / 178) r := mod(s1/30269 + s2/30307 + s3/30323, 1)
Los valores de semilla s1
y deben inicializarse con valores distintos de cero s2
.s3
Wichmann y Hill (1982) afirman que su generador RANDOM producirá números pseudoaleatorios uniformes que son estrictamente mayores que cero y menores que uno. Sin embargo, dependiendo de la precisión de la máquina, se pueden producir algunos valores cero debido a un error de redondeo.El problema ocurre con el punto flotante de precisión simple al redondear a cero.
Wichmann y Hill (1982) sugirieron un generador pseudoaleatorio basado en la suma de números pseudoaleatorios generados por métodos congruenciales multiplicativos. Sin embargo, esto no es más que un método eficiente para implementar un generador congruencial multiplicativo con una longitud de ciclo mucho mayor que el entero máximo. Utilizando el
Teorema del Resto Chino
(ver por ejemplo
Knuth, 1981
) puedes probar que obtendrás los mismos resultados utilizando sólo un generador congruencial multiplicativo
X
n
+1
=
α
⋅
X
n
módulo
m
con
α
= 1655 54252 64690
,
m
= 2781 71856 04309
. Sin embargo, la versión original todavía es necesaria para hacer que un generador con constantes tan largas funcione en aritmética informática ordinaria.