Pregunta

Después de leer esta respuesta: la mejor manera de elegir un subconjunto aleatorio de una colección ?

Me pregunto, ¿cómo se elige una semilla aleatoria en Java?

Y no digas usar System.currentTimeMillis () o System.nanoTime (). Lee el artículo para ver por qué no.

Esa es una pregunta difícil, pero déjame hacerla más difícil. Digamos que necesita generar una semilla aleatoria sin conectarse a Internet, sin usar la entrada del usuario (IE, no hay gui) y tiene que ser multiplataforma (por lo tanto, no hay JNI para acceder al hardware).

¿Hay algunas variables JVM que podemos monitorear como fuente de nuestra aleatoriedad?

¿Se puede hacer esto? ¿O es imposible?

¿Fue útil?

Solución

Echa un vistazo a Uncommons Maths (revelación completa: lo escribí). Debería resolver la mayoría de los problemas que tendrás con números aleatorios en Java.

Incluso, si no lo usa, debería poder obtener algunas ideas de las diferentes SeedGenerator que proporciona. Básicamente, el uso predeterminado es / dev / random . Si eso no existe (por ejemplo, Windows), intenta descargar datos de random.org o usa SecureRandom.generateSeed .

Creo que SecureRandom.generateSeed es lo mejor que puedes hacer sin confiar en ninguna plataforma específica o en Internet.

Otros consejos

Combine System.currentTimeMillis () con un contador global que incremente cada vez que genere la semilla. Utilice AtomicLong para el contador para que pueda aumentar con eficiencia y seguridad de subprocesos.

" Combinar " no significa " agregar " o " xor " Porque es muy fácil conseguir duplicados. En cambio, hash. Podría complicarse y rellenar el largo y el contador, por ejemplo. 16 bytes y MD5, pero probablemente usaría una versión de 64 bits del CRC de Adler o alguna otra CRC de 64 bits .

Um, ese artículo dice que las semillas de 32 bits son malas, pero las semillas de 64 bits son buenas. System.currentTimeMillis () es una semilla de 64 bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top