Java: genera números aleatorios (método Math.random(), clase Random, clase ThreadLocalRandom, clase SecureRandom)


1. El método random() de la clase Math

Solo se pueden generar números aleatorios de 0~1 (incluido 0, sin incluir 1) de tipo doble.

//产生一个min~max内的随机数。
int r = (int)min + (int)(Math.random() * (max - min));

2. Clase aleatoria

La clase Random está en el paquete java.util.

Crea el objeto antes de usarlo:Random r = new Random();

Número de semilla : al generar números aleatorios, el número de origen del algoritmo aleatorio se denomina número de semilla, y se realiza una determinada transformación sobre la base del número de semilla para generar el número aleatorio requerido.

El algoritmo aleatorio utilizado es el método de congruencia lineal de número pseudoaleatorio ( algoritmo LGC )
 
.Ventajas :
 
proporciona una gran cantidad de métodos de generación de números aleatorios, que pueden generar booleanos, enteros, largos, flotantes, matrices de bytes y tipos dobles de números aleatorios
 
con alta eficiencia de ejecución Genera más rápido.
 
Desventajas :
 
Los números aleatorios generados son números pseudoaleatorios, es decir, números aleatorios regulares.
 
Cuando los objetos tienen el mismo número semilla, los números aleatorios generados por el mismo número de veces son los mismos.

Dos métodos de construcción de Random comúnmente usados :
 
1) Random(): Este método de construcción usa el tiempo de nanosegundos del sistema actual como el número inicial y luego usa este número inicial para construir un objeto Random.
 
2) Aleatorio (semilla larga): cree un nuevo generador de números aleatorios con un solo parámetro de tipo largo.

Métodos comunes de la clase Random :

Random es seguro para subprocesos.

La seguridad de subprocesos significa que, en un escenario de subprocesos múltiples, el resultado de la ejecución del programa es consistente con el resultado esperado, lo que se denomina seguridad de subprocesos; de lo contrario, no es seguro para subprocesos (también llamado seguridad de subprocesos). Por ejemplo, si hay dos subprocesos, el primer subproceso realiza 100 000 ++ operaciones y el segundo subproceso realiza 100 000 - operaciones, entonces el resultado final no se debe sumar ni restar.Si el resultado final del programa no coincide con las expectativas, No es seguro para subprocesos.


Tres, clase ThreadLocalRandom

Cree un objeto ThreadLocalRandom antes de usarlo:
 
ThreadLocalRandom random = ThreadLocalRandom.current();

Ventajas :
 
1) ThreadLocalRandom combina las clases Random y ThreadLocal y está aislado en el hilo actual. Por lo tanto, logra un mejor rendimiento en un entorno de subprocesos múltiples al evitar la competencia por las semillas operativas, y también garantiza la seguridad de sus subprocesos.
 
2) Además, a diferencia de Random, ThreadLocalRandom explícitamente no admite la configuración de semillas aleatorias. Anula el
método setSeed (semilla larga) de Random y lanza UnsupportedOperationException directamente, lo que reduce la posibilidad de números aleatorios repetidos para múltiples subprocesos.

Desventaja :
 
por defecto, su semilla aleatoria también es relativa a la hora actual.
 
Es decir, si este parámetro no está configurado de manera predeterminada, varios subprocesos pueden generar el mismo número aleatorio en cada operación debido al mismo tiempo de inicio en varios subprocesos.

Ejemplo :

//SecureRandom类的示例是仅将下面这一步改成:
// 创建 SecureRandom 对象,并设置加密算法
//SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

// 得到 ThreadLocalRandom 对象
ThreadLocalRandom random = ThreadLocalRandom.current();

for (int i = 0; i < 10; i++) {
    
    
    // 生成 0-9 随机整数
    int number = random.nextInt(10);
    // 打印结果
    System.out.println("生成随机数:" + number);
}

Cuarto, la clase SecureRandom

Cree un objeto SecureRandom y configure el algoritmo de cifrado antes de usarlo:
 
SecureRandom admite dos algoritmos de cifrado de forma predeterminada: el algoritmo SHA1PRNG y el algoritmo NativePRNG.
 
① SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
 
O ② SecureRandom random = SecureRandom.getInstance("NativePRNG");
 
o use new SecureRandom()para crear un objeto SecureRandom:
 
③SecureRandom secureRandom = new SecureRandom();
 
por defecto, el algoritmo NativePRNG se usará para generar números aleatorios.

SecureRandom y Random
 
1) SecureRandom se hereda de Random, que proporciona un generador de números aleatorios criptográficamente fuerte.
 
2) SecureRandom es diferente de Random, recopila algunos eventos aleatorios, como clics del mouse, clics del teclado, etc. SecureRandom usa estos eventos aleatorios como semillas. Es decir, la semilla es impredecible, a diferencia de Random que usa los milisegundos de la hora actual del sistema como semilla por defecto, evitando así la posibilidad de generar el mismo número aleatorio.


V. Resumen

1) Math es una encapsulación de Random, los dos son similares.
 
2) Random genera números pseudoaleatorios con el tiempo actual de nanosegundos como número inicial.
 
Cuando la competencia de subprocesos múltiples es feroz, existen ciertos problemas de rendimiento para realizar la operación CAS,
 
pero para la mayoría de los escenarios de aplicación, usar Random es suficiente.
 
3) Cuando la competencia de subprocesos múltiples es feroz: use ThreadLocalRandom en lugar de Random
 
4) Cuando los requisitos de seguridad son altos: use SecureRandom
 
porque SecureRandom recopilará algunos eventos aleatorios como semillas aleatorias, que pueden considerarse como una clase de herramienta para generar eventos aleatorios reales números.


referencia:

La red china en lenguaje C Java genera números aleatorios (random() y clases Random)

Cloud + Community - ¡4 formas de generar números aleatorios en Tencent Cloud Java! (⭐)

Supongo que te gusta

Origin blog.csdn.net/xiaoyu_alive/article/details/123322334
Recomendado
Clasificación