Como e princípio de números aleatórios em java
Verifique as informações relacionadas a números aleatórios e organize -as especialmente
Primeiro, vamos falar sobre várias maneiras de gerar números aleatórios em java
En. . . De fato, o terceiro método acima é usado para gerar números aleatórios no método de construção padrão da Random.
Existem duas maneiras de construir classe aleatória no método 2: com sementes e sem sementes
Sem sementes: esse método retornará números aleatórios e os resultados de cada execução são diferentes, o que é equivalente ao uso do System.CurrentTimEmillis () como semente.
Com as sementes: dessa maneira, o resultado de retorno será o mesmo, não importa quantas vezes o programa seja executado. Se duas instâncias aleatórias forem criadas com a mesma semente, a mesma sequência de chamadas de método será feita para cada instância e elas gerarão e retornarão a mesma sequência de números.
Número pseudo-aleatório
Números aleatórios em computadores são números pseudo-aleatórios
Aqui está um programa C como este:
// rand_1.cpp#inclua <stdlib.h> estático não assinado int rand_seed; não assinado int aleatória (void) {rand_seed = (rand_seed*123+59)%65536; return (rand_seed);} void random_start (void) {int temp [2]; moveata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4); Rand_seed = temp [0];} void main () {não assinado int i, n; random_start (); para (i = 0; i <10; i ++) printf ("#u/t", aleatoriamente ()); printf ("/n");} Ele explica totalmente o processo de geração de números aleatórios:
primeiro,
moveata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Esta função é usada para mover dados de memória. FP_SEG (ponteiro distante para segmento) é uma função que leva o endereço do segmento da matriz temp, fp_off (ponteiro distante para deslocamento) é uma função que leva o endereço relativo da matriz TEMP, e a função MOVELATA é colocar as palavras duplas localizadas na unidade de armazenamento 0040: 006 nas duas unidades de memória declinada por prisão. Dessa forma, um número de 16 bits às 0040: 006CH pode ser enviado para Rand_seed através da matriz Temp.
Segundo,
Rand_seed = (rand_seed*123+59)%65536;
É um método usado para calcular números aleatórios. O método de cálculo dos números aleatórios é diferente em diferentes computadores, mesmo em diferentes sistemas operacionais instalados no mesmo computador. Eu tentei no Linux e no Windows, respectivamente. Os números aleatórios gerados pelas mesmas sementes aleatórias nesses dois sistemas operacionais são diferentes, o que significa que eles têm métodos de cálculo diferentes.
Então,
moveata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Por que as sementes aleatórias precisam ser recuperadas em 0040: 006ch na memória? O que é armazenado em 0040: 006ch?
Aqueles que estudaram o curso "Princípios de componentes de computador e tecnologia de interface" podem se lembrar que, ao compilar o programa de serviço de interrupção do ROM BIOS Clock, o tempo/center Intel 8253 é usado. Sua comunicação com o chip de interrupção Intel 8259 permite que o programa de serviço de interrupção opere. As 18.2 interrupções geradas pela placa -mãe por segundo são geradas pelo processador controla o chip de interrupção com base no valor de tempo/contador. Existe um tempo/contador na placa -mãe do nosso computador para calcular o tempo atual do sistema. O contador será adicionado toda vez que um ciclo de sinal do relógio passa. Onde está o valor desse contador armazenado? É isso mesmo, apenas às 0040: 006CH na memória, esse espaço de memória é realmente definido assim:
Timer_low dw?; O endereço é 0040: 006CH
Timer_high dw?; O endereço é 0040: 006eh
Timer_oft db? ; O endereço é 0040: 0070H
No programa de serviço de interrupção do relógio, sempre que o Timer_low ficar cheio, o contador também ficará cheio e o valor do contador é zero, ou seja, o binário de 16 bits em Timer_low é zero, e Timer_High é adicionado um. em rand01.c
moveata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
É precisamente os dois números binários de 16 bits Timer_low e Timer_High que são colocados na matriz temporária e enviados para Rand_seed, obtendo assim a "semente aleatória".
Agora, uma coisa que pode ser determinada é que a semente aleatória vem do relógio do sistema, ou melhor, o valor do registro na memória do tempo/contador na placa -mãe do computador.
En ... sem último. . lvl--
Vejamos outro pedaço de código:
//rand_2.cpp#include <iostream> #include <cstdlib> usando namespace std; int main () {srand (((não assinado) tempo (nulo)); não assinado int r = rand (); cout << "r =" << r << endl; // De acordo com o padrão C ++ 98, a função principal pode ser introduzida sem usar a declaração de retorno para retornar 0;} Aqui, se o usuário e outros programas não definirem uma semente aleatória, o valor do tempo/contador do sistema é usado como semente aleatória. Portanto, no mesmo ambiente da plataforma, depois de compilar e gerar um exe, cada vez que você o executa, o número aleatório exibido será um número pseudo-aleatório, ou seja, os resultados exibidos serão diferentes toda vez que você o executar.
Resumir
Números aleatórios são valores calculados por sementes aleatórias com base em determinados métodos de cálculo. Portanto, desde que o método de cálculo seja certo e a semente aleatória seja certa, o número aleatório gerado não mudará. No mesmo ambiente de plataforma, depois de compilar e gerar um exe, os números aleatórios exibidos são os mesmos toda vez que você o executa. Isso ocorre porque, no mesmo ambiente da plataforma de compilação, os métodos de cálculo para gerar números aleatórios a partir de sementes aleatórias são iguais e as sementes aleatórias são as mesmas, portanto os números aleatórios gerados são os mesmos.
Enquanto o usuário ou terceiro não define uma semente aleatória, por padrão, a semente aleatória vem do relógio do sistema (ou seja, o valor do tempo/contador)
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!