La verdadera generación aleatoria en Java

Estaba leyendo el javadoc de Math.random () y vi que el azar es solo psuedandom.

¿Hay una biblioteca (específicamente Java) que genere números aleatorios de acuerdo con variables aleatorias como temperatura ambiental, temperatura / voltaje de la CPU o algo así?

Consulte http://random.org/

RANDOM.ORG es un verdadero servicio de números aleatorios que genera aleatoriedad a través del ruido atmosférico.

La biblioteca de Java para interactuar con ella se puede encontrar aquí: http://sourceforge.net/projects/trng-random-org/

Su pregunta es ambigua, lo que está causando que las respuestas estén por todos lados.

Si está buscando una implementación Aleatoria que dependa de la fuente de aleatoriedad del sistema (como supongo que es así), entonces javax.crypto.SecureRandom lo hace. La configuración predeterminada para el proveedor de seguridad de Sun en su archivo java.security tiene lo siguiente:

# # Select the source of seed data for SecureRandom. By default an # attempt is made to use the entropy gathering device specified by # the securerandom.source property. If an exception occurs when # accessing the URL then the traditional system/thread activity # algorithm is used. # # On Solaris and Linux systems, if file:/dev/urandom is specified and it # exists, a special SecureRandom implementation is activated by default. # This "NativePRNG" reads random bytes directly from /dev/urandom. # # On Windows systems, the URLs file:/dev/random and file:/dev/urandom # enables use of the Microsoft CryptoAPI seed functionality. # securerandom.source=file:/dev/urandom 

Si realmente está preguntando sobre anular esto con algo aún más aleatorio, puede hacerlo cambiando esta propiedad o utilizando otro SecureRandom. Por ejemplo, podría usar un proveedor de JCE respaldado por un módulo de HSM como nCipher nShield que tiene su propio PRNG u otras soluciones mencionadas en el hilo.

Como aprovechar estas fonts de datos aleatorios requeriría acceso a hardware de algún tipo, dicha biblioteca no se puede escribir de forma portable usando Java puro.

Sin embargo, puede tratar de escribir un código dependiente de la plataforma para leer las plataformas fuente de datos aleatorios. Para Linux (y posiblemente otros sistemas tipo Unix también) que podría ser /dev/random por ejemplo.

Además, consulte la clase SecureRandom , es posible que ya tenga lo que desea.

Rápido y sucio:

 public static int generateRandom() throws IOException { int num = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); for (int i = 0 ; i < Integer.SIZE ; i++) { System.out .println("Flip a fair coin. Enter h for heads, anything else for tails."); if (br.readLine().charAt(0) == 'h') { num += Math.pow(2, i); } } return num; } 

Asegúrese de que realmente quiere números aleatorios “verdaderos”. Deben medirse las fonts físicas de aleatoriedad y el proceso de medición introduce algún sesgo. Para algunas aplicaciones, los números aleatorios “pseudo” son en realidad preferibles a los números aleatorios “verdaderos”. Pueden tener mejores propiedades estadísticas y puedes generarlas más rápido. Por otro lado, puede dispararse en el pie con generadores de números pseudoaleatorios si no tiene cuidado.

La architecture criptográfica J ava requiere números aleatorios criptográficamente fuertes. Contiene la clase SecureRandom mencionada por @saua.

No existe un verdadero generador de números aleatorios ya que todos confían de una manera u otra en los procedimientos determinísticos para calcular un número aleatorio, así que, sin importar cómo los números generados parecen seguir una distribución aleatoria verdadera, podrían ser parte de un oculto -y muy patrón complejo, por lo tanto, son pseudoaleatorios . Sin embargo, puede implementar su propio generador de números aleatorios, hay un par de buenos métodos computacionales baratos que puede leer en Recetas numéricas en C, Segunda edición, Sección 7 . HTH

Solo para aclarar: El único generador aleatorio TRUE que existe en el universo es Quantum Random Bit Generator . No hay otro mecanismo que le asegure que los bits generados son totalmente aleatorios, porque incluso si ahora no puede predecir el resultado, no hay garantía de que no podrá hacerlo en el futuro.

Quantum Random Bit Generator ‘(QRBG121), que es un generador rápido de bits aleatorios no deterministas (número) cuya aleatoriedad se basa en la aleatoriedad intrínseca del proceso físico cuántico de emisión fotónica en semiconductores y la posterior detección por efecto fotoeléctrico. En este proceso, los fotones se detectan al azar, uno por uno, independientemente el uno del otro. La información de tiempo de los fotones detectados se usa para generar dígitos binarios al azar: bits. La característica única de este método es que utiliza un solo detector de fotones para producir tanto ceros como unos que producen un sesgo muy pequeño y una gran inmunidad a la variación y el envejecimiento de los componentes. Además, la detección de fotones individuales se realiza mediante un fotomultiplicador (PMT). En comparación con los detectores de fotones de estado sólido, los PMT tienen un rendimiento de señal a ruido drásticamente superior y una probabilidad mucho menor de aparición de postpulsos, lo que podría ser una fuente de correlaciones no deseadas.

Más información por ejemplo aquí: http://random.irb.hr/

Cita de Wikipedia: John von Neumann dijo de manera célebre que “cualquiera que utilice métodos aritméticos para producir números aleatorios está en estado de pecado”.

Para la mayoría de los propósitos, los números pseudoaleatorios son más que suficientes. Si solo necesitas un número aleatorio simple, es decir. en el 30% de las veces haz esto, luego, una marca de tiempo como semilla es lo que quieres. Si tiene que ser un número aleatorio seguro, por ejemplo, barajar un mazo, si desea elegir su semilla con más cuidado, existen buenas fonts para crear semillas seguras.

La razón para usar semillas es poder “recordar” la misma secuencia de números aleatorios generados por el algoritmo. Un muy buen escenario para eso es cuando estás haciendo una simulación estocástica de algún tipo y quieres repetir un experimento en particular, entonces simplemente usas la misma semilla.

Para obtener un PRNG mejor que el que viene con Java, eche un vistazo al Mersenne Twister .

En la universidad, tuve la tarea de implementar un generador aleatorio. Creé un generador de números aleatorios como este: creé una ventana de escritorio y le pedí a un usuario que haga clic en lugares aleatorios en la ventana, después de cada clic tomé las coordenadas del punto en el que se hizo clic. Eso fue bastante aleatorio, creo.

Ver también esta pregunta SO: Fuentes alternativas de entropía

Encontré HotBits hace varios años: los números se generan a partir de la desintegración radiactiva, números genuinamente aleatorios.

Hay una biblioteca java para acceder al randomx

Hay límites en la cantidad de números que puede descargar al día, pero siempre me ha divertido usarlos como semillas realmente, realmente aleatorias para RNG.

¡Hasta donde yo sé, trabajan con el tiempo de la máquina …!

Para qué números aleatorios se utilizan

Los números aleatorios se han utilizado durante muchos miles de años. Ya sea que se trate de lanzar una moneda o tirar un dado, el objective es dejar el resultado final en una posibilidad aleatoria. Los generadores de números aleatorios en una computadora son similares: son un bash de lograr un resultado impredecible y aleatorio.

¿Es posible hacer verdaderos números aleatorios?

Sí lo es !

Para generar un número aleatorio “verdadero”, la computadora mide algún tipo de fenómeno físico que tiene lugar fuera de la computadora.

Para un ejemplo más cotidiano, la computadora puede confiar en el ruido atmosférico o simplemente usar la hora exacta en que presionas las teclas de tu teclado como fuente de datos impredecibles o entropía. Por ejemplo, su computadora podría notar que presionó una tecla exactamente a los 0.23423523 segundos después de las 2 p.m. Aproveche los tiempos específicos asociados con estas pulsaciones de teclas y tendrá una fuente de entropía que puede usar para generar un número aleatorio “verdadero”.

El NSA y el generador de números aleatorios de hardware de Intel

Para facilitar las cosas a los desarrolladores y ayudar a generar números aleatorios seguros, los chips Intel incluyen un generador de números aleatorios basado en hardware conocido como RdRand. Este chip usa una fuente de entropía en el procesador y proporciona números aleatorios al software cuando el software los solicita.

fuente: HowToGeek?

En caso de que tal vez necesites generar números aleatorios en Android … utilizo Data of Accelerometer para obtener verdaderos números aleatorios basados ​​en la física 🙂