Clase aleatoria (java.util)
El algoritmo aleatorio implementado en la clase aleatoria es pseudo-aleatorio, es decir, aleatorio con las reglas. Al realizar la aleatorización, el número de origen del algoritmo aleatorio se llama semillas, que realiza una cierta transformación basada en las semillas, generando así los números aleatorios requeridos.
Objetos aleatorios con el mismo número de semillas, los números aleatorios generados por el mismo número de veces son exactamente los mismos. En otras palabras, para dos objetos aleatorios con el mismo número de semilla, los números aleatorios generados por primera vez son exactamente los mismos, y los números aleatorios generados por segunda vez son exactamente los mismos. Esto requiere una atención especial al generar múltiples números aleatorios.
A continuación se describe el uso de la clase aleatoria, así como cómo generar una matriz aleatoria de intervalos especificados y las posibilidades requeridas en el programa de implementación.
1. Generación de objetos aleatorios
La clase aleatoria contiene dos constructores, que se introducen en la secuencia a continuación:
a. Public Random ()
Este método de construcción utiliza un número relacionado con el tiempo relativo correspondiente al tiempo del sistema actual como número de semilla, y luego usa este número de semilla para construir el objeto aleatorio.
b. público aleatorio (semilla larga)
Este constructor se puede crear formulando un número de semilla.
Código de muestra:
La copia del código es la siguiente:
Random r = new Random ();
R1 aleatorio = nuevo aleatorio (10);
Nuevamente: el número de semillas es solo el número de origen del algoritmo aleatorio y no tiene nada que ver con el intervalo de los números aleatorios generados.
2. Métodos comunes en clase aleatoria
Los métodos en la clase aleatoria son relativamente simples, y las funciones de cada método también son fáciles de entender. Cabe señalar que los números aleatorios generados por cada método en la clase aleatoria se distribuyen uniformemente, lo que significa que la probabilidad de generación numérica dentro del intervalo es igual. Aquí hay una introducción básica a estos métodos:
a. Public Boolean NextBoolean ()
La función de este método es generar un valor booleano aleatorio, y la probabilidad de generar valores verdaderos y falsos es igual, es decir, ambos son del 50%.
b. Public Double NextDouble ()
El propósito de este método es generar un valor doble aleatorio, con el valor entre [0, 1.0).
C, public int NextInt ()
El propósito de este método es generar un valor INT aleatorio, que está entre -231 y 231-1.
Si necesita generar un valor INT para un intervalo específico, debe realizar una cierta transformación matemática. Para más detalles, consulte el código en el ejemplo de uso a continuación.
D, Public int Nextint (int n)
La función de este método es generar un valor INT aleatorio, que está dentro del intervalo de [0, n), es decir, un valor INT aleatorio entre 0 y N, que contiene 0 pero no n.
Si desea generar un valor INT para un intervalo específico, también debe realizar una cierta transformación matemática. Para más detalles, consulte el código en el ejemplo de uso a continuación.
E, Public Void Setseed (semilla larga)
El propósito de este método es restablecer el número de semillas en el objeto aleatorio. Después de establecer el número de semillas, el objeto aleatorio es el mismo que el objeto aleatorio creado con la nueva palabra clave.
3. Ejemplo de uso de clase aleatoria
Usando la clase aleatoria, generalmente es generar números aleatorios para un intervalo especificado. Lo siguiente introducirá cómo generar números aleatorios para un intervalo correspondiente uno por uno. Los siguientes códigos que generan números aleatorios se generan utilizando el siguiente objeto aleatorio R:
Random r = new Random ();
a. Genere decimales del intervalo [0, 1.0)
La copia del código es la siguiente:
doble d1 = R.NextDouble ();
Se obtiene directamente utilizando el método NextDouble.
b. Generar decimales del intervalo [0,5.0)
La copia del código es la siguiente:
doble d2 = R.NextDouble () * 5;
Debido a que el intervalo número generado por el método NextDouble es [0, 1.0), expandir el intervalo por 5 veces es el intervalo requerido.
Del mismo modo, generar un decimal aleatorio en el intervalo [0, d) y D es cualquier decimal positivo, solo necesita multiplicar el valor de retorno del método NextDouble por d.
do. Generar decimales en el intervalo [1,2.5)
La copia del código es la siguiente:
doble d3 = R.NextDouble () * 1.5 + 1;
Para generar un decimal aleatorio del intervalo [1, 2.5), solo necesita generar primero un número aleatorio del intervalo [0, 1.5) y luego agregar 1 al intervalo de número aleatorio generado.
Del mismo modo, para generar cualquier número aleatorio en el rango de intervalo decimal [D1, D2) que no comienza desde 0 (donde D1 no es igual a 0), solo necesita generar primero un número aleatorio en el intervalo [0, D2-D1) y luego agregar el intervalo de número aleatorio generado a D1.
d. Generar cualquier entero
La copia del código es la siguiente:
int n1 = R.NextInt ();
Simplemente use el método NextInt directamente.
mi. Genere enteros en intervalo [0,10)
La copia del código es la siguiente:
int n2 = R.NextInt (10);
n2 = Math.abs (R.NextInt () % 10);
Las dos líneas de código anteriores pueden generar enteros en el intervalo [0,10).
La primera implementación se implementa directamente utilizando el método NextInt (int n) en la clase aleatoria.
En la segunda implementación, primero llame al método NextInt () para generar un número INT arbitrario. El intervalo generado por la suma número de 10 es (-10,10), y luego encuentra el valor absoluto del intervalo, y el intervalo obtenido es [0,10).
Del mismo modo, para generar enteros aleatorios en cualquier intervalo [0, n) puede usar el siguiente código:
La copia del código es la siguiente:
int n2 = R.NextInt (n);
n2 = math.abs (r.nextint () % n);
F. Genere enteros en intervalo [0,10]
La copia del código es la siguiente:
int n3 = R.NextInt (11);
n3 = Math.abs (R.NextInt () % 11);
En comparación con el intervalo entero, el intervalo [0,10] y el intervalo [0,11) son equivalentes, por lo que se genera un entero del intervalo [0,11).
gramo. Genere enteros en el intervalo [-3,15)
La copia del código es la siguiente:
int n4 = R.NextInt (18) - 3;
n4 = Math.abs (R.NextInt () % 18) - 3;
Para generar enteros aleatorios que no comienzan desde 0, puede consultar la descripción anterior del principio de implementación del intervalo decimal que no comienza desde 0.
H, oportunidad de lograr
La implementación de la lógica del programa de acuerdo con una cierta oportunidad también es un problema que puede resolverse mediante un procesamiento aleatorio. Aquí hay un ejemplo simple para demostrar cómo implementar la lógica del azar usando números aleatorios.
En la introducción del método anterior, los números generados en el método Nextint (int n) son uniformes, es decir, las posibilidades de generación de cada número dentro del intervalo son las mismas. Entonces, si se genera un entero aleatorio en el intervalo [0,100), las posibilidades de generar cada número deben ser las mismas, y dado que hay 100 enteros en el intervalo, las posibilidades de cada número son del 1%. Según esta teoría, el problema de probabilidad en el programa puede realizarse.
Ejemplo: genere aleatoriamente un entero que genera 1 con 55% de probabilidad, 2 con 40% de probabilidad y 3 con un 5% de probabilidad. El código implementado es el siguiente:
La copia del código es la siguiente:
int n5 = R.NextInt (100);
int m; // número de resultado
if (n5 <55) {// El intervalo de 55 números, 55% de probabilidad
m = 1;
} else if (n5 <95) {// [55,95), intervalo de 40 números, 40% de probabilidad
m = 2;
}demás{
m = 3;
}
Debido a que la probabilidad de cada número es del 1%, la probabilidad de cualquier intervalo de 55 dígitos es del 55%. Para la conveniencia de escribir el código, todos los enteros en el intervalo [0,55) se usan aquí, y el principio posterior es el mismo.
Por supuesto, el código aquí puede simplificarse porque las probabilidades son múltiplos del 5%, por lo que solo controle las posibilidades basadas en el 5%. La siguiente es la implementación del código simplificado:
La copia del código es la siguiente:
int n6 = R.NextInt (20);
int m1;
if (n6 <11) {
m1 = 1;
} else if (n6 <19) {
m1 = 2;
}demás{
m1 = 3;
}
Dentro del programa, la lógica de probabilidad se puede implementar de acuerdo con las instrucciones anteriores.
4. Otros problemas
a. El problema del objeto aleatorio con el mismo número de semilla
Como se mencionó anteriormente, los objetos aleatorios con el mismo número de semillas tienen los mismos números aleatorios generados por el mismo número de veces. El siguiente es el código de prueba:
La copia del código es la siguiente:
R1 aleatorio = nuevo aleatorio (10);
R2 aleatorio = nuevo aleatorio (10);
para (int i = 0; i <2; i ++) {
System.out.println (r1.nextint ());
System.out.println (r2.NextInt ());
}
En este código, el número de semillas utilizadas por los objetos R1 y R2 son 10, por lo que los números aleatorios generados por el mismo número de veces son exactamente los mismos.
Si desea evitar la situación en la que los números aleatorios son los mismos, debe tener en cuenta que no importa cuántos números aleatorios necesite generar en el proyecto, solo puede usar un objeto aleatorio.
b. Sobre el método aleatorio en la clase de matemáticas
De hecho, también hay un método aleatorio en la clase de matemáticas. El trabajo de este método aleatorio es generar un decimal aleatorio del intervalo [0, 1.0).
Al leer el código fuente de la clase de matemáticas, podemos encontrar que el método aleatorio en la clase de matemáticas se implementa llamando directamente al método NextDouble en la clase aleatoria.
Es solo que el método aleatorio se llama relativamente simple, por lo que muchos programadores están acostumbrados a usar el método aleatorio de la clase de matemáticas para generar números aleatorios.