números generados al azar tienen muchos usos en los programas de ordenador, tales como la creación de imprevisibilidad en los juegos, el modelado de simulaciones y se realiza la encriptación. Java proporciona dos técnicas para la generación de números aleatorios. La biblioteca de Matemáticas ofrece un método sencillo, pero muy práctico, al azar para generar un valor de coma flotante aleatorio entre 0 y 1,0. La clase Random proporciona capacidades más flexibles de números aleatorios que genera.
Lo esencial
Un generador de números aleatorios es una rutina diseñada para producir un valor numérico que parece elegido por casualidad. En Java, al igual que con todos los lenguajes de programación, los valores generados por Math.random () y la clase Random aparecen al azar, pero en realidad no lo son. Por lo tanto, se dice que tales métodos para producir números pseudo-aleatorios.
propiedades
generadores de números pseudo-aleatorios tienen dos propiedades básicas: la distribución y la semilla.
La "distribución" se refiere a la frecuencia en la que aparece cada valor de una serie de números generados. La mayoría de los métodos aleatorios de Java producir una distribución uniforme de los números, es decir, sin un valor aparecerá con más frecuencia que cualquier otro. La clase tiene un método aleatorio, nextGaussian, que genera números que siguen a una (o también "normal" o "curva de campana") distribución de Gauss.
La "semilla" es un número que se usa para inicializar un generador de números pseudo-aleatorio. Dada la misma semilla, un generador de números pseudo-aleatoria producirá una serie idéntica de números cuando llamada usando los mismos métodos y parámetros. La capacidad para reproducir un conjunto de números es útil en la depuración, pruebas y otros escenarios en los que recrear entorno de ejecución de una aplicación es necesaria.
Math.random ()
El método Math.random () es un simple generador de números pseudo-aleatorio. Se utiliza simplemente llamando Math.random (). El método devuelve un doble entre el 0,0 (ambos inclusive) y 1,0 (exclusivo). Los valores producidos siguen una distribución uniforme. Si se necesitan un rango diferente, el tipo o la distribución, el programador debe emitir los resultados al tipo deseado y realizar cálculos adicionales para generar el resultado deseado.
La clase Random
La clase aleatoria es más flexible que Math.random (), pero requiere un poco más de esfuerzo para su uso. Una instancia de la clase Random se construye. El constructor tendrá un entero largo como el valor de la semilla, o si no se proporciona un valor de semilla, utilizará la hora actual en milisegundos como la semilla por defecto. La clase Random proporciona un método de fijación de la semilla después de la construcción. Hay varios métodos numéricos generar pseudo-aleatorios en esta clase, cada uno con el prefijo "siguiente". La mayoría de estos métodos devuelven valores uniformemente distribuidos a través de diversos rangos y de diversos tipos, tales como enteros, valores de coma flotante y valores booleanos. El método devuelve nextGaussian dobles distribuidas gaussianas. El método nextInt puede tomar un parámetro entero que define el extremo superior de la gama.
consideraciones
Generación de un conjunto de números que no se pueden predecir a veces es deseable, por ejemplo, para evitar que los jugadores de la posibilidad de hacer trampas en los juegos. Los valores pseudoaleatorios devueltos por varias instancias de la clase Random se pueden combinar para proporcionar aleatoriedad adicional en el conjunto resultante. La implementación de una distribución no uniforme también puede ser útil.
Java genera números pseudo-aleatorios que siguen o bien una distribución uniforme o gausiana. distribuciones no uniformes son útiles, sobre todo en las simulaciones para imitar los escenarios que se ajusten a las distribuciones específicas en la realidad. Otras distribuciones se puede lograr utilizando la función de distribución acumulada inversa de la distribución deseada. Esta función toma una probabilidad (un valor entre 0,0 y 1,0 exclusivo) como parámetro. Los resultados no nulos de cualquiera Math.random () o uno de los métodos de la clase aleatorios que produce un valor de coma flotante se pueden utilizar para este parámetro. Vea la sección de Recursos para un enlace a la Biblioteca de Matemáticas Apache, que proporciona métodos inversos para varias distribuciones acumulativas.