El Mersenne Twister es un generador de números pseudoaleatorios (PRNG). Es, con mucho, el PRNG de uso general más utilizado. [1] Su nombre deriva del hecho de que la duración de su período se elige para ser un primo de Mersenne .
El Mersenne Twister fue desarrollado en 1997 por Makoto Matsumoto (松本 眞) y Takuji Nishimura (西村 拓 士) . [2] Fue diseñado específicamente para rectificar la mayoría de los defectos encontrados en PRNG más antiguos.
La versión más utilizada del algoritmo Mersenne Twister se basa en el Mersenne prime 2 19937 −1. La implementación estándar de eso, MT19937, usa una longitud de palabra de 32 bits . Hay otra implementación (con cinco variantes [3] ) que usa una longitud de palabra de 64 bits, MT19937-64; genera una secuencia diferente.
Adopción en sistemas de software
El Mersenne Twister es el PRNG predeterminado para los siguientes sistemas de software: Dyalog APL , [4] Microsoft Excel , [5] GAUSS , [6] GLib , [7] GNU Multiple Precision Arithmetic Library , [8] GNU Octave , [9] Biblioteca científica GNU , [10] gretl , [11] IDL , [12] Julia , [13] CMU Common Lisp , [14] Embeddable Common Lisp , [15] Steel Bank Common Lisp , [16] Maple , [17] MATLAB , [18] Free Pascal , [19] PHP , [20] Python , [21] [22] [23] R , [24] Ruby , [25] SageMath , [26] Scilab , [27] Stata . [28]
También está disponible en Apache Commons , [29] en C ++ estándar (desde C ++ 11 ), [30] [31] y en Mathematica . [32] Las implementaciones de complementos se proporcionan en muchas bibliotecas de programas, incluidas las bibliotecas Boost C ++ , [33] la biblioteca CUDA , [34] y la biblioteca numérica NAG . [35]
El Mersenne Twister es uno de los dos PRNG en SPSS : el otro generador se mantiene solo por compatibilidad con programas más antiguos, y se dice que el Mersenne Twister es "más confiable". [36] El Mersenne Twister es igualmente uno de los PRNG en SAS : los otros generadores son más antiguos y están en desuso. [37] El Mersenne Twister es el PRNG predeterminado en Stata , el otro es KISS , por compatibilidad con versiones anteriores de Stata. [38]
Ventajas
- Con licencia permisiva y sin patente para todas las variantes excepto CryptMT.
- Pasa numerosas pruebas de aleatoriedad estadística, incluidas las pruebas Diehard y la mayoría, pero no todas, las pruebas TestU01 . [39]
- Un período muy largo de 2 19937 - 1. Tenga en cuenta que si bien un período largo no es garantía de calidad en un generador de números aleatorios, períodos cortos, como el 2 32 común en muchos paquetes de software más antiguos, pueden ser problemáticos. [40]
- k -distribuido con una precisión de 32 bits por cada 1 ≤ k ≤ 623 (para una definición de k -distribuido, ver más abajo )
- Las implementaciones generalmente crean números aleatorios más rápido que los métodos aleatorios verdaderos. Un estudio encontró que el Mersenne Twister crea números aleatorios de coma flotante de 64 bits aproximadamente veinte veces más rápido que el conjunto de instrucciones RDRAND basado en el procesador implementado en hardware . [41]
Desventajas
- Búfer de estado relativamente grande, de 2,5 KiB , a menos que se utilice la variante TinyMT (discutida a continuación).
- Rendimiento mediocre según los estándares modernos, a menos que se utilice la variante SFMT (que se analiza a continuación). [42]
- Exhibe dos fallas claras (complejidad lineal) tanto en Crush como en BigCrush en la suite TestU01. La prueba, como Mersenne Twister, se basa en un álgebra F 2 . [39] Hay varios otros generadores que pasan todas las pruebas (y numerosos generadores que fallan gravemente) [ aclaración necesaria ] .
- Varias instancias que difieren solo en el valor de semilla (pero no en otros parámetros) generalmente no son apropiadas para las simulaciones de Monte-Carlo que requieren generadores de números aleatorios independientes, aunque existe un método para elegir múltiples conjuntos de valores de parámetros. [43] [44]
- Difusión deficiente: puede llevar mucho tiempo comenzar a generar una salida que pase las pruebas de aleatoriedad , si el estado inicial es muy no aleatorio, especialmente si el estado inicial tiene muchos ceros. Una consecuencia de esto es que dos instancias del generador, comenzadas con estados iniciales que son casi iguales, generalmente generarán casi la misma secuencia para muchas iteraciones, antes de eventualmente divergir. La actualización de 2002 del algoritmo MT ha mejorado la inicialización, por lo que es muy improbable comenzar con ese estado. [45] Se dice que la versión GPU (MTGP) es aún mejor. [46]
- Contiene subsecuencias con más de 0 que de 1. Esto se suma a la propiedad de difusión deficiente para dificultar la recuperación de estados de muchos cero.
- No es criptográficamente seguro , a menos que se utilice la variante CryptMT (que se describe a continuación). La razón es que observar un número suficiente de iteraciones (624 en el caso de MT19937, ya que este es el tamaño del vector de estado a partir del cual se producen las iteraciones futuras) permite predecir todas las iteraciones futuras.
Alternativas
Un generador alternativo, WELL ("Lineal de largo período bien equidistribuido"), ofrece una recuperación más rápida, igual aleatoriedad y una velocidad casi igual. [47]
Los generadores y variantes xorshift de Marsaglia son los más rápidos en la clase de LFSR. [48]
Los MELG de 64 bits (" Generadores lineales F 2 con máxima equidistribución de 64 bits con período de prima de Mersenne") están completamente optimizados en términos de las propiedades de distribución k . [49]
La familia ACORN (publicada en 1989) es otro PRNG con distribución k , que muestra una velocidad de cálculo similar a la MT y mejores propiedades estadísticas, ya que satisface todos los criterios actuales (2019) de TestU01; cuando se usa con opciones apropiadas de parámetros, ACORN puede tener un período y precisión arbitrariamente largos.
La familia PCG es un generador de período largo más moderno, con una mejor ubicación de caché y un sesgo menos detectable utilizando métodos de análisis modernos. [50]
k -distribución
Se dice que una secuencia pseudoaleatoria x i de enteros de w bits de período P tiene una distribución k con una precisión de v bits si se cumple lo siguiente.
- Deje que trunc v ( x ) denote el número formado por los primeros v bits de x , y considere P de los k v - vectores de bits
- .
- Luego, cada una de las posibles combinaciones de bits de 2 kv ocurre el mismo número de veces en un período, excepto por la combinación de todos ceros que ocurre una vez con menos frecuencia.
Detalle algorítmico
Para una longitud de palabra de w bits, el Mersenne Twister genera números enteros en el rango [0, 2 w −1].
El algoritmo de Mersenne Twister se basa en una recurrencia lineal de matriz sobre un campo binario finito F 2 . El algoritmo es un registro de desplazamiento de retroalimentación generalizado retorcido [51] (GFSR retorcido o TGFSR) de forma normal racional (TGFSR (R)), con reflexión y templado de bits de estado. La idea básica es definir una serie x i a través de una relación de recurrencia simple, y luego generar números de la forma x i T , donde T es una matriz F 2 invertible llamada matriz de templado .
El algoritmo general se caracteriza por las siguientes cantidades (algunas de estas explicaciones tienen sentido solo después de leer el resto del algoritmo):
- w : tamaño de la palabra (en número de bits)
- n : grado de recurrencia
- m : palabra intermedia, un desplazamiento utilizado en la relación de recurrencia que define la serie x , 1 ≤ m < n
- r : punto de separación de una palabra, o el número de bits de la máscara de bits inferior, 0 ≤ r ≤ w - 1
- a : coeficientes de la matriz de torsión en forma normal racional
- b , c : Máscaras de bits de templado TGFSR (R)
- s , t : cambios de bit de templado TGFSR (R)
- u , d , l : cambios de broca / máscaras de templado Mersenne Twister adicionales
con la restricción de que 2 nw - r - 1 es un primo de Mersenne. Esta elección simplifica la prueba de primitividad y la prueba de distribución k que se necesitan en la búsqueda de parámetros.
La serie x se define como una serie de cantidades de w bits con la relación de recurrencia:
dónde denota concatenación de vectores de bits (con los bits superiores a la izquierda), ⊕ el bit a bit exclusivo o (XOR), x k u significa los w superiores - r bits de x k , y x k +1 l significa los r bits inferiores de x k +1 . La transformación de torsión A se define en forma normal racional como:
con I n −1 como la ( n - 1) × ( n - 1) matriz identidad. La forma normal racional tiene la ventaja de que la multiplicación por A se puede expresar eficientemente como: (recuerde que aquí la multiplicación de matrices se realiza en F 2 y, por lo tanto, XOR bit a bit toma el lugar de la suma)
donde x 0 es el bit de orden más bajo de x .
Al igual que TGFSR (R), el Mersenne Twister se conecta en cascada con una transformada de templado para compensar la dimensionalidad reducida de la equidistribución (debido a que la elección de A está en la forma normal racional). Tenga en cuenta que esto es equivalente a usar la matriz A donde A = T −1 AT para T una matriz invertible y, por lo tanto, el análisis del polinomio característico mencionado a continuación aún se mantiene.
Al igual que con A , elegimos una transformada de templado para que sea fácilmente computable y, por lo tanto, no construimos T en sí. El revenido se define en el caso de Mersenne Twister como
- y : = x ⊕ (( x ≫ u ) & d )
- y : = y ⊕ (( y ≪ s ) & b )
- y : = y ⊕ (( y ≪ t ) & c )
- z : = y ⊕ ( y ≫ l )
donde x es el siguiente valor de la serie, y un valor intermedio temporal, z el valor devuelto por el algoritmo, con ≪, ≫ como el bit a bit a izquierda y derecha se desplaza, y & como bit a bit y . La primera y la última transformación se agregan para mejorar la equidistribución de bits inferiores. De la propiedad de TGFSR, se requiere s + t ≥ / w / 2⌋ - 1 para alcanzar el límite superior de equidistribución para los bits superiores.
Los coeficientes para MT19937 son:
- ( ancho , norte , metro , r ) = (32, 624, 397, 31)
- a = 9908B0DF 16
- ( u , d ) = (11, FFFFFFFF 16 )
- ( s , b ) = (7, 9D2C5680 16 )
- ( t , c ) = (15, EFC60000 16 )
- l = 18
Tenga en cuenta que las implementaciones de 32 bits del Mersenne Twister generalmente tienen d = FFFFFFFF 16 . Como resultado, la d se omite ocasionalmente de la descripción del algoritmo, ya que el bit a bit y con d en ese caso no tiene ningún efecto.
Los coeficientes para MT19937-64 son: [52]
- ( ancho , norte , metro , r ) = (64, 312, 156, 31)
- a = B5026F5AA96619E9 16
- ( u , d ) = (29, 5555555555555555 16 )
- ( s , b ) = (17, 71D67FFFEDA60000 16 )
- ( t , c ) = (37, FFF7EEE000000000 16 )
- l = 43
Inicialización
El estado necesario para una implementación de Mersenne Twister es una matriz de n valores de w bits cada uno. Para inicializar la matriz, se utiliza un valor de inicialización de w -bit para suministrar x 0 a x n −1 estableciendo x 0 en el valor de inicialización y luego estableciendo
- x yo = f × ( x yo −1 ⊕ ( x yo −1 >> ( w - 2))) + yo
para i de 1 a n - 1 . El primer valor que genera el algoritmo se basa en x n , no en x 0 . La constante f forma otro parámetro para el generador, aunque no forma parte del algoritmo propiamente dicho. El valor de f para MT19937 es 1812433253 y para MT19937-64 es 6364136223846793005. [52]
Comparación con GFSR clásico
Para alcanzar el límite superior teórico 2 nw - r - 1 del período en una T GFSR , φ B ( t ) debe ser un polinomio primitivo , siendo φ B ( t ) el polinomio característico de
La transformación de torsión mejora el GFSR clásico con las siguientes propiedades clave:
- El período alcanza el límite superior teórico 2 nw - r - 1 (excepto si se inicializa con 0)
- Equidistribución en n dimensiones (por ejemplo, los generadores congruentes lineales pueden, en el mejor de los casos, gestionar una distribución razonable en cinco dimensiones)
Pseudocódigo
El siguiente pseudocódigo implementa el algoritmo general de Mersenne Twister. Las constantes w , n , m , r , a , u , d , s , b , t , c , l y f son como en la descripción del algoritmo anterior. Se supone que int representa un tipo suficiente para contener valores con w bits:
// Crea una matriz de longitud n para almacenar el estado del generador int [0 .. n -1] MT int index: = n +1 const int lower_mask = (1 << r ) - 1 // Es decir, el binario número de r 1's const int upper_mask = w bits más bajos de ( no lower_mask) // Inicializar el generador desde una función semilla seed_mt ( int seed) { índice: = n MT [0]: = semilla para i de 1 a ( n - 1) { // bucle sobre cada elemento MT [i]: = w bits más bajos de ( f * (MT [i-1] xor (MT [i-1] >> ( w - 2))) + i) } } // Extrae un valor templado basado en MT [índice] // llamando twist () cada n números function extract_number () { if index> = n { if index> n { error "El generador nunca fue sembrado" // Alternativamente, semilla con valor constante; 5489 se utiliza en el código C de referencia [53] } giro() } int y: = MT [índice] y: = y xor ((y >> u ) y d ) y: = y xor ((Y << s ) y b ) y: = y xor ((y << t ) y c ) y: = y xor (y >> l ) índice: = índice + 1 devuelve los w bits más bajos de (y) } // Genera los siguientes n valores de la serie x_i función twist () { para i de 0 a ( n -1) { int x: = (MT [i] y upper_mask) + (MT [(i + 1) mod n ] y lower_mask) int xA: = x >> 1 if (x mod 2)! = 0 { // bit más bajo de x es 1 xA: = xA xor a } MT [i]: = MT [(i + m ) mod n ] xor xA } índice: = 0 }
Variantes
CryptMT
CryptMT es un cifrado de flujo y un generador de números pseudoaleatorios criptográficamente seguro que utiliza Mersenne Twister internamente. [54] [55] Fue desarrollado por Matsumoto y Nishimura junto a Mariko Hagita y Mutsuo Saito. Se ha enviado al proyecto eSTREAM de la red eCRYPT . [54] A diferencia de Mersenne Twister o sus otros derivados, CryptMT está patentado .
MTGP
MTGP es una variante de Mersenne Twister optimizada para unidades de procesamiento de gráficos publicada por Mutsuo Saito y Makoto Matsumoto. [56] Las operaciones básicas de recurrencia lineal se extienden desde MT y los parámetros se eligen para permitir que muchos subprocesos calculen la recursividad en paralelo, mientras comparten su espacio de estado para reducir la carga de memoria. El documento afirma una mejor equidistribución sobre MT y rendimiento en una GPU muy antigua ( Nvidia GTX260 con 192 núcleos) de 4,7 ms para 5 × 10 7 enteros aleatorios de 32 bits.
SFMT
El SFMT ( Fast Mersenne Twister orientado a SIMD ) es una variante de Mersenne Twister, introducido en 2006, [57] diseñado para ser rápido cuando se ejecuta en SIMD de 128 bits.
- Es aproximadamente el doble de rápido que Mersenne Twister. [58]
- Tiene una mejor propiedad de equidistribución de precisión de v-bit que MT pero peor que WELL ("Lineal de período largo bien equidistribuido") .
- Tiene una recuperación más rápida del estado inicial de exceso cero que MT, pero más lenta que WELL.
- Soporta varios períodos de 2 607 −1 a 2 216091 −1.
Intel SSE2 y PowerPC AltiVec son compatibles con SFMT. También se utiliza para juegos con Cell BE en PlayStation 3 . [59]
TinyMT
TinyMT es una variante de Mersenne Twister, propuesta por Saito y Matsumoto en 2011. [60] TinyMT usa solo 127 bits de espacio de estado, una disminución significativa en comparación con los 2,5 KiB de estado del original. Sin embargo, tiene un período de 2 127 -1, mucho más corto que el original, por lo que solo lo recomiendan los autores en los casos en que la memoria es escasa.
Referencias
- ^ Por ejemplo, Marsland S. (2011) Machine Learning ( CRC Press ), §4.1.1. Consulte también la sección "Adopción en sistemas de software".
- ^ Matsumoto, M .; Nishimura, T. (1998). "Tornado de Mersenne: un generador de números pseudoaleatorios uniforme equidistribuido en 623 dimensiones" (PDF) . Transacciones ACM sobre modelado y simulación por computadora . 8 (1): 3–30. CiteSeerX 10.1.1.215.1141 . doi : 10.1145 / 272991.272995 . S2CID 3332028 .
- ^ John Savard. "El tornado de Mersenne" .
Un artículo posterior, publicado en el año 2000, dio cinco formas adicionales del Mersenne Twister con el período 2 ^ 19937-1. Los cinco fueron diseñados para implementarse con aritmética de 64 bits en lugar de aritmética de 32 bits.
- ^ "Enlace aleatorio" . Guía de referencia del lenguaje Dyalog . Consultado el 4 de junio de 2020 .
- ^ Mélard, G. (2014), "Sobre la precisión de los procedimientos estadísticos en Microsoft Excel 2010", Computational Statistics , 29 (5): 1095–1128, CiteSeerX 10.1.1.455.5508 , doi : 10.1007 / s00180-014-0482- 5 , S2CID 54032450.
- ^ Referencia de idioma de GAUSS 14
- ^ Números aleatorios: Manual de referencia de GLib
- ^ "Algoritmos de números aleatorios" . GNU MP . Consultado el 21 de noviembre de 2013 .
- ^ "16.3 Matrices de utilidad especiales" . GNU Octave .
Función incorporada: rand
- ^ "Variables de entorno de números aleatorios" . Biblioteca científica GNU . Consultado el 24 de noviembre de 2013 .
- ^ " uniforme ". Referencia de funciones de Gretl .
- ^ "RANDOMU (Referencia IDL)" . Exelis VIS Docs Center . Consultado el 23 de agosto de 2013 .
- ^ "Números aleatorios" . Documentación de Julia Language: la biblioteca estándar .
- ^ "Opciones de diseño y ampliaciones" . Manual del usuario de CMUCL . Consultado el 3 de febrero de 2014 .
- ^ "Estados aleatorios" . El manual de ECL . Consultado el 20 de septiembre de 2015 .
- ^ "Generación de números aleatorios" . Manual del usuario de SBCL .
- ^ "generador de números aleatorios" . Ayuda en línea de Maple . Consultado el 21 de noviembre de 2013 .
- ^ "Algoritmos generadores de números aleatorios" . Centro de documentación, MathWorks .
- ^ "aleatorio" . documentación pascal libre . Consultado el 28 de noviembre de 2013 .
- ^ "mt_rand - Genera un mejor valor aleatorio" . Manual de PHP . Consultado el 2 de marzo de 2016 .
- ^ "9.6 aleatorio - Generar números pseudoaleatorios" . Documentación de Python v2.6.8 . Consultado el 29 de mayo de 2012 .
- ^ "8.6 aleatorio - Generar números pseudoaleatorios" . Documentación de Python v3.2 . Consultado el 29 de mayo de 2012 .
- ^ "aleatorio - Generar números pseudoaleatorios - documentación de Python 3.8.3" . Documentación de Python 3.8.3 . Consultado el 23 de junio de 2020 .
- ^ "Generadores de números aleatorios" . Vista de tareas CRAN: distribuciones de probabilidad . Consultado el 29 de mayo de 2012 .
- ^ " Documentación de clase " aleatoria "" . Documentación de Ruby 1.9.3 . Consultado el 29 de mayo de 2012 .
- ^ Distribuciones de probabilidad - Manual de referencia de Sage v7.2: Probabilidad
- ^ "grand - Números aleatorios" . Ayuda de Scilab .
- ^ Nuevo generador de números aleatorios: Mersenne Twister de 64 bits
- ^ "Generación de datos" . Guía del usuario de Apache Commons Math .
- ^ "Generación de números aleatorios en C ++ 11" (PDF) . Base C ++ estándar .
- ^ "std :: mersenne_twister_engine" . Generación de números pseudoaleatorios . Consultado el 25 de septiembre de 2012 .
- ^ [1] Documentación de Mathematica
- ^ "boost / random / mersenne_twister.hpp" . Impulsar las bibliotecas de C ++ . Consultado el 29 de mayo de 2012 .
- ^ "Descripción general de la API de host" . Documentación del kit de herramientas de CUDA . Consultado el 2 de agosto de 2016 .
- ^ "G05 - Generadores de números aleatorios" . Introducción al capítulo de la biblioteca NAG . Consultado el 29 de mayo de 2012 .
- ^ "Generadores de números aleatorios" . Estadísticas de IBM SPSS . Consultado el 21 de noviembre de 2013 .
- ^ "Uso de funciones de números aleatorios" . Referencia del lenguaje SAS . Consultado el 21 de noviembre de 2013 .
- ^ Stata help: set rng - Establece qué generador de números aleatorios (RNG) usar
- ^ a b P. L'Ecuyer y R. Simard, " TestU01:" Biblioteca de CA para pruebas empíricas de generadores de números aleatorios ", ACM Transactions on Mathematical Software , 33, 4, artículo 22 (agosto de 2007).
- ^ Nota: 2 19937 es aproximadamente 4,3 × 10 6001 ; esto es muchos órdenes de magnitud mayor que el número estimado de partículas en el universo observable , que es 10 87 .
- ^ Route, Matthew (10 de agosto de 2017). "Síntesis de población enana ultrafría radiante". El diario astrofísico . 845 (1): 66. arXiv : 1707.02212 . Código Bibliográfico : 2017ApJ ... 845 ... 66R . doi : 10.3847 / 1538-4357 / aa7ede . S2CID 118895524 .
- ^ "Fast Mersenne Twister (SFMT) orientado a SIMD: dos veces más rápido que Mersenne Twister" . Sociedad Japonesa para la Promoción de la Ciencia . Consultado el 27 de marzo de 2017 .
- ^ Makoto Matsumoto; Takuji Nishimura. "Creación dinámica de generadores de números pseudoaleatorios" (PDF) . Consultado el 19 de julio de 2015 .
- ^ Hiroshi Haramoto; Makoto Matsumoto; Takuji Nishimura; François Panneton; Pierre L'Ecuyer. "Avanzar eficientemente para generadores de números aleatorios lineales F2" (PDF) . Consultado el 12 de noviembre de 2015 .
- ^ "mt19937ar: Mersenne Twister con inicialización mejorada" . hiroshima-u.ac.jp . Consultado el 4 de octubre de 2015 .
- ^ Fog, Agner (1 de mayo de 2015). "Generadores de números pseudoaleatorios para procesadores vectoriales y procesadores multinúcleo" . Revista de métodos estadísticos aplicados modernos . 14 (1): 308–334. doi : 10.22237 / jmasm / 1430454120 .
- ^ P. L'Ecuyer, "Generadores de números aleatorios uniformes", Enciclopedia internacional de ciencia estadística , Lovric, Miodrag (Ed.), Springer-Verlag, 2010.
- ^ "xorshift * / xorshift + generators y el tiroteo PRNG" .
- ^ Harase, S .; Kimoto, T. (2018). "Implementación de generadores lineales F 2 de 64 bits con máxima equidistribución con Mersenne Prime Period" . Transacciones ACM en software matemático . 44 (3): 30: 1–30: 11. arXiv : 1505.06582 . doi : 10.1145 / 3159444 . S2CID 14923086 .
- ^ "El Papel PCG" .
- ^ Matsumoto, M .; Kurita, Y. (1992). "Generadores GFSR trenzados" . Transacciones ACM sobre modelado y simulación por computadora . 2 (3): 179-194. doi : 10.1145 / 146382.146383 . S2CID 15246234 .
- ^ a b "std :: mersenne_twister_engine" . Generación de números pseudoaleatorios . Consultado el 20 de julio de 2015 .
- ^ Takuji Nishimura; Makoto Matsumoto. "Un programa C para MT19937, con inicialización mejorada 2002/1/26" . Consultado el 20 de julio de 2015 .
- ^ a b "CryptMt y Fubuki" . eCRYPT . Consultado el 12 de noviembre de 2017 .
- ^ Matsumoto, Makoto; Nishimura, Takuji; Hagita, Mariko; Saito, Mutsuo (2005). "Criptográfico Mersenne Twister y Fubuki Stream / Block Cipher" (PDF) .
- ^ Mutsuo Saito; Makoto Matsumoto (2010). "Variantes de Mersenne Twister adecuadas para procesadores gráficos". arXiv : 1005.4973v3 [ cs.MS ].
- ^ "Fast Mersenne Twister (SFMT) orientado a SIMD" . hiroshima-u.ac.jp . Consultado el 4 de octubre de 2015 .
- ^ "SFMT: Comparación de velocidad" . hiroshima-u.ac.jp . Consultado el 4 de octubre de 2015 .
- ^ "Licencia de PlayStation3" . scei.co.jp . Consultado el 4 de octubre de 2015 .
- ^ "Tiny Mersenne Twister (TinyMT)" . hiroshima-u.ac.jp . Consultado el 4 de octubre de 2015 .
Otras lecturas
- Harase, S. (2014), "En el -relaciones lineales de los generadores de números pseudoaleatorios de Mersenne Twister ", Matemáticas y Computadoras en Simulación , 100 : 103-113, arXiv : 1301.5435 , doi : 10.1016 / j.matcom.2014.02.002 , S2CID 6984431.
- Harase, S. (2019), "Conversión de Mersenne Twister a números de coma flotante de doble precisión", Matemáticas y Computadoras en Simulación , 161 : 76–83, arXiv : 1708.06018 , doi : 10.1016 / j.matcom.2018.08.006 , S2CID 19777310.
enlaces externos
- El artículo académico de MT y artículos relacionados de Makoto Matsumoto
- Página de inicio de Mersenne Twister, con códigos en C, Fortran, Java, Lisp y algunos otros idiomas
- Ejemplos de Mersenne Twister ( una colección de implementaciones de Mersenne Twister, en varios lenguajes de programación) en GitHub
- SFMT en acción: Parte I - Generación de una DLL que incluye soporte SSE2 - en Code Project