Cómo y el principio de los números aleatorios en Java
Verifique la información relacionada con los números aleatorios y la organice especialmente
Primero, hablemos de varias formas de generar números aleatorios en Java
Es. . . De hecho, el tercer método anterior se usa para generar números aleatorios en el método de construcción predeterminado de Aandation.
Hay dos formas de construir una clase aleatoria en el método 2: con semillas y sin semillas
Sin semillas: este método devolverá números aleatorios, y los resultados de cada ejecución son diferentes, lo cual es equivalente a usar System.CurrentTimemillis () como semilla.
Con semillas: de esta manera, el resultado de retorno será el mismo sin importar cuántas veces se ejecute el programa. Si se crean dos instancias aleatorias con la misma semilla, se realiza la misma secuencia de llamadas de método en cada instancia y generarán y devolverán la misma secuencia de números.
Número pseudo-aleatorio
Los números aleatorios en las computadoras son números pseudo-aleatorios
Aquí hay un programa C como este:
// rand_1.cpp#include <stdlib.h> static unsigned int rand_seed; unsigned int random (void) {rand_seed = (rand_seed*123+59)%65536; return (rand_seed);} void random_start (void) {int temp [2]; Movedata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4); Rand_seed = temp [0];} void main () {unsigned int i, n; random_start (); para (i = 0; i <10; i ++) printf ("#u/t", random ()); printf ("/n");} Explica completamente el proceso de generación de números aleatorios:
primero,
Movedata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Esta función se utiliza para mover los datos de la memoria. FP_SEG (Pointer Far to Segment) es una función que toma la dirección de segmento de la matriz TEMP, FP_OFF (Pointer Far to Offset) es una función que lleva la dirección relativa de la matriz TEMP, y la función MovedATA es poner las palabras dobles ubicadas en la unidad de almacenamiento de 0040: 006ch en las dos unidades de memoria declaradas por la temperatura de la matriz. De esta manera, se puede enviar un número de 16 bits a 0040: 006ch a Rand_seed a través de la matriz de temperatura.
Segundo,
Rand_seed = (rand_seed*123+59)%65536;
Es un método utilizado para calcular números aleatorios. El método de cálculo de los números aleatorios es diferente en diferentes computadoras, incluso en diferentes sistemas operativos instalados en la misma computadora. Lo he probado en Linux y Windows respectivamente. Los números aleatorios generados por las mismas semillas aleatorias en estos dos sistemas operativos son diferentes, lo que significa que tienen diferentes métodos de cálculo.
Entonces,
Movedata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
¿Por qué las semillas aleatorias deben recuperarse a 0040: 006ch en la memoria? ¿Qué se almacena en 0040: 006ch?
Aquellos que han estudiado el curso "Principios de los componentes de la computadora y la tecnología de interfaz" pueden recordar que al compilar el programa de servicio de interrupción del reloj ROM BIOS, se utiliza la sincronización/contador Intel 8253. Su comunicación con el chip de interrupción Intel 8259 permite que funcione el programa de servicio de interrupción. Las interrupciones 18.2 generadas por la placa base por segundo son generadas por el procesador controla el chip de interrupción en función del valor de sincronización/contador. Hay un momento/contador en la placa base de nuestra computadora para calcular el tiempo actual del sistema. El contador se agregará uno cada vez que pase un ciclo de señal de reloj. ¿Dónde está el valor de este contador almacenado? Así es, justo a las 0040: 006ch en la memoria, este espacio de memoria en realidad se define así:
Timer_low dw? La dirección es 0040: 006ch
Timer_high dw? La dirección es 0040: 006EH
¿Timer_oft DB? ; La dirección es 0040: 0070H
En el programa de servicio de interrupción del reloj, cada vez que Timer_low se vuelve completo, el contador también se volverá completo, y el valor del contador es cero, es decir, el binario de 16 bits en Timer_low está a cero y Timer_high se agrega uno. en rand01.c
Movedata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Precisamente son los dos números binarios de 16 bits Timer_low y Timer_high que se colocan en la matriz temporal y se envían a Rand_seed, obteniendo así la "semilla aleatoria".
Ahora, una cosa que se puede determinar es que la semilla aleatoria proviene del reloj del sistema, o más bien, el valor de registro en la memoria de la sincronización/contador en la placa base de la computadora.
Es ... no último. . lvl--
Veamos otro código:
//rand_2.cpp#include <iostream> #include <cstdlib> usando namespace std; int main () {srand ((unsigned) time (null)); unsigned int r = rand (); cout << "r =" << r << endl; // Según el estándar C ++ 98, la función principal se puede introducir sin usar la declaración de retorno para devolver 0;} Aquí, si el usuario y otros programas no establecen una semilla aleatoria, el valor de la sincronización/contador del sistema se usa como una semilla aleatoria. Por lo tanto, en el mismo entorno de plataforma, después de compilar y generar un EXE, cada vez que lo ejecute, el número aleatorio que se muestra será un número pseudo-aleatorio, es decir, los resultados que se muestran serán diferentes cada vez que lo ejecute.
Resumir
Los números aleatorios son valores calculados por semillas aleatorias basadas en ciertos métodos de cálculo. Por lo tanto, siempre que el método de cálculo sea seguro y la semilla aleatoria sea segura, el número aleatorio generado no cambiará. En el mismo entorno de plataforma, después de compilar y generar un EXE, los números aleatorios que se muestran son los mismos cada vez que lo ejecuta. Esto se debe a que en el mismo entorno de la plataforma de compilación, los métodos de cálculo para generar números aleatorios a partir de semillas aleatorias son los mismos, y las semillas aleatorias son los mismos, por lo que los números aleatorios generados son los mismos.
Siempre que el usuario o tercero no establezca una semilla aleatoria, entonces, por defecto, la semilla aleatoria proviene del reloj del sistema (es decir, el valor del tiempo/contador)
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!