Algoritmos de generación de números pseudoaleatorios

12

¿Qué algoritmos se utilizan en los generadores de números aleatorios modernos y de buena calidad?

Mehper C. Palavuzlar
fuente
1
Se etiquetó "variable aleatoria" a "variable aleatoria" para mantener la coherencia con preguntas similares.
Whuber

Respuestas:

10

En R, la configuración predeterminada para la generación de números aleatorios son:

  1. Para U (0,1), use el algoritmo Mersenne-Twister
  2. Para los números de Guassian, use la inversión numérica de la función de distribución normal estándar.

Puede verificar esto fácilmente, a saber.

> RNGkind()
[1] "Mersenne-Twister" "Inversion"

Es posible cambiar el generador predeterminado a otros PRNG, como Super-Duper, Wichmann-Hill, Marsaglia-Multicarry o incluso un PRNG suministrado por el usuario. Ver el? RNGkind para más detalles. Nunca he necesitado cambiar el PRNG predeterminado.

La biblioteca C GSL también usa el Mersenne-Twister por defecto.

csgillespie
fuente
¿Está seguro de su segundo punto, que genera variables aleatorias normales al invertir el CDF? La inversa del CDF normal es una función bastante cara de evaluar. Me imagino que el método de Box-Muller sería más rápido. Más rápido aún sería el método de zigurat de Marsaglia para generar normales.
John D. Cook
También me parece sospechoso. El Zigurat de Marsaglia es el predeterminado en Matlab, y no puedo imaginar que Matlab sea mejor que R en el campo de la generación de números aleatorios.
shabbychef
@John De hecho, el método polar está disponible en R, vea el paquete setRNG.
chl
3

El Xorshift PNG diseñado por George Marsaglia. Su período (2 ^ 128-1) es mucho más corto que el de Mersenne-Twister, pero el algoritmo es muy simple de implementar y se presta a la paralelización. Funciona bien en arquitecturas de muchos núcleos, como chips DSP y Tesla de Nvidia.

brotchie
fuente
¿Sería bueno para implementar en GPU? Enlace a detalles, referencias?
DarenW
2
Thomas, Howes, Luk - 2009 - Una comparación de CPU, GPU, FPGA y arreglos de procesadores paralelos masivos para la generación de números aleatorios. doi.acm.org/10.1145/1508128.1508139 . Discusión + puntos de referencia de un conjunto de PNG que se ejecutan en CPU, GPU, FPGA y matrices de procesadores paralelos masivos.
brotchie
¿Quizás también el RNG de L'Ecuyer con múltiples transmisiones ( j.mp/bzJSlm )?
chl
3

En http://prng.di.unimi.it/ se puede encontrar una tanda de varios generadores de números aleatorios probada usando TestU01, el conjunto de pruebas moderna para los generadores de números pseudoaleatorios que reemplazó recalcitrante y dieharder. Puedes elegir y elegir.

seba
fuente