Robots y modelos

Notas sobre pruebas, modelado y aventuras en Java y Android

Reemplazando java.util.Random por el Mersenne Twister

leave a comment »

Esta mañana un compañero me mandó un enlace sobre la (mala) calidad del generador de números pseudoaleatorios que viene con la biblioteca estándar de Java: la clase Random. Ya había oído cosas acerca de que era malo, pero esto lo dejó bastante claro:
 
http://www.alife.co.uk/nonrandom/
 
La cosa es que no debería verse un patrón en la imagen que genera la applet, y además se repite con bastante facilidad. Java dispone de otra implementación mejor (SecureRandom), pero tiene dos pegas:
  • No puedes saber con total seguridad qué proveedor se está usando, ya que depende de lo que venga de serie en la JVM. Si quieres uno concreto lo puedes indicar por nombre, pero entonces te atas a una JVM determinada.
  • setSeed(…) no reinicia el algoritmo con la nueva semilla, sino que alimenta a la semilla existente con la nueva información. Dado que SecureRandom es para uso criptográfico más que para simulaciones, no es mala idea, pero yo necesito que los resultados sean los mismos siempre que ponga la misma semilla:-/.

Por ello, tuve que descartar SecureRandom también, y la única opción era buscar un PRNG bueno en alguna biblioteca externa. Mirando un poco encontré Uncommons Maths, una biblioteca escrita en Java puro de sólo 50KB y bajo la ASL 2.0, que encima superaba la batería Diehard (que parece ser una buena referencia en el mundillo de los PRNG). Según este hilo de Stack Overflow, los resultados del autor original son reproducibles y j.u.Random no cumple esa batería de pruebas.

Por lo pronto he pasado uno de mis programas de Random al MersenneTwisterPRNG (una implementación del Mersenne Twister de Matsumoto y Nishimura), que es el recomendado por el autor para simulaciones de propósito general. Ha sido más fácil de lo que esperaba, ya que todos los PRNG de Uncommon Maths heredan de Random, así que es un sustituto limpio. Y por si no fuera poco, Uncommon Maths también implementa algunas distribuciones comunes de probabilidad (normal, Poisson, exponencial y binomial por lo menos) e incorpora PRNG con más rendimiento (basados en operaciones lógicas XOR) o con más seguridad (AES). Está muy completa la biblioteca🙂.

Written by bluezio

16 de enero de 2013 a 0:14

Publicado en Uncategorized

Tagged with

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: