¿Qué aprendemos de los libros?
La forma más obvia e intuitiva es generar números aleatorios en Java con una llamada simple:
java.lang.math.random ()
En todos los demás idiomas, generar números aleatorios es como usar clases de herramientas de matemáticas como ABS, POW, Floor, SQRT y otras funciones matemáticas. La mayoría de las personas aprenden sobre esta categoría a través de libros, tutoriales y cursos. Un ejemplo simple: se puede generar un número de punto flotante de doble precisión de 0.0 a 1.0. Luego, a través de la información anterior, el desarrollador quiere generar un número de punto flotante de doble precisión entre 0.0 y 10.0 y escribirlo así:
Math.random () * 10
Si se genera un entero entre 0 y 10, se escribirá como:
Math.round (Math.random () * 10)
Avanzado
Al leer el código fuente de Math.random (), o simplemente usar la función de finalización automática del IDE, los desarrolladores pueden encontrar fácilmente que java.lang.math.random () usa un objeto generado al azar interno: un objeto muy potente puede ser flexible aleatorio al azar al azar Generación: valores booleanos, todos los tipos numéricos e incluso distribuciones gaussianas. Por ejemplo:
Nuevo java.util.random (). Nextint (10)
Tiene una desventaja, es decir, es un objeto. Su método debe llamarse a través de una instancia, lo que significa que su constructor debe llamarse primero. Si hay suficiente memoria, las expresiones como la anterior son aceptables;
Una solución simple que puede evitar crear una nueva instancia cada vez que un número aleatorio es usar una clase estática. Es posible que haya pensado en java.lang.math, muy bien, estamos mejorando la inicialización de java.lang.math. Aunque este proyecto es bajo, también debe hacer algunas pruebas unitarias simples para asegurarse de que no salga mal.
Suponiendo que el programa necesita generar un número aleatorio para almacenar, el problema vuelve a aparecer. Por ejemplo, a veces es necesario operar o proteger las semillas, y se usa un número interno para almacenar el estado y calcular el siguiente número aleatorio. En estos casos especiales, es inapropiado compartir objetos generados aleatoriamente.
concurrente
En el entorno de la aplicación multiproceso Java EE, los objetos de instancia generados aleatoriamente aún se pueden almacenar en una clase u otra clase de implementación como una propiedad estática. Afortunadamente, java.util.random es seguro de hilo, por lo que no existe riesgo de que múltiples llamadas de hilos destruyan la semilla.
Otra cosa que vale la pena considerar es la instancia multiproceso de java.lang.threadlocal. El enfoque perezoso es implementar una sola instancia a través de la API de Java.
Aunque Java no proporciona una buena manera de administrar una sola instancia de java.util.random. Sin embargo, el tan esperado Java 7 proporciona una nueva forma de generar números aleatorios:
java.util.concurrent.threadlocalrandom.current (). nextint (10)
Esta nueva API combina las ventajas de otros dos enfoques: acceso único/acceso estático, tan flexible como Math.Random (). Threadlocalrandom también es más rápido que cualquier otra forma de manejar una alta concurrencia.
experiencia
Chris Marasti-Georg señala:
Math.round (Math.random () * 10)
Haga que la distribución desequilibrada, por ejemplo: 0.0 - 0.499999 se redondará a 0, mientras que 0.5 a 1.4999999 redondeará a 1. Entonces, cómo usar la sintaxis de estilo antiguo para lograr una distribución equilibrada correcta, de la siguiente manera:
Math.floor (Math.random () * 11)
Afortunadamente, si usamos java.util.random o java.util.concurrent.threadlocalrandom, no tenemos que preocuparnos por lo anterior.
El proyecto práctico de Java presenta algunos de los daños de la API Java.util.Random. Esta lección nos dice que no usemos:
Math.abs (rnd.nextint ())%n
Y usar:
rnd.nextint (n)
Ythe anterior es una introducción relacionada con los números aleatorios en Java, y espero que sea útil para el aprendizaje de todos.