2012-02-05 18 views
13

Necesito generar una secuencia controlada de números pseudoaleatorios, dado un parámetro entero inicial. Para eso estoy usando la clase Java Random estándar, sembrada por un parámetro entero. Me gustaría asegurarme de que generaré la misma secuencia en todos los sistemas (sistema operativo, pero también la versión de Java/JDK), en el futuro previsible (¡y más!).Reproducibilidad de números java pseudoaleatorios en sistemas y versiones?

En resumen: ¿Se asegura la reproducibilidad de Java/portabilidad de su generador de números pseudo-aleatorios a través aplicación y versiones?

Nota: le he pedido the exact same question for Python. Desde que cambié el lenguaje de implementación a Java pero por otros motivos.

+1

estará bien siempre que no reutilice el mismo generador de múltiples hilos. Ahora no entiendo mal este comentario: el generador en sí es seguro para subprocesos, pero si está generando números de varios subprocesos usando el mismo generador, no podrá reproducir de manera consistente las llamadas de sus varios hilos exactamente de la misma manera. orden en varios sistemas (ni siquiera en varias ejecuciones en el mismo sistema). – TacticalCoder

+0

Ese no será el caso, pero gracias por la sugerencia. Bueno, para ser precisos, puedes reproducir la misma secuencia dentro de varios hilos utilizando un mecanismo de bloqueo adecuado, pero estoy de acuerdo contigo, eso es un problema. –

Respuesta

14

Sí.

El javadoc explica:

una instancia de esta clase se utiliza para generar un flujo de números pseudoaleatorios. La clase usa una semilla de 48 bits, que se modifica usando una fórmula congruente lineal. (Véase Donald Knuth, The Art of Computer Programming, Volumen 2, Sección 3.2.1.)

Si se crean dos instancias de Random con la misma semilla, y la misma secuencia de llamadas a métodos se hace para cada uno, generará y devolverá secuencias idénticas de números. Para garantizar esta propiedad, se especifican los algoritmos particulares para la clase Random. Las implementaciones de Java deben usar todos los algoritmos que se muestran aquí para el class Random, en aras de la portabilidad absoluta del código de Java. Sin embargo, las subclases de class Random tienen permitido usar otros algoritmos, siempre que cumplan los contratos generales para todos los métodos.

Cuestiones relacionadas