Classe aleatória (java.util)
O algoritmo aleatório implementado na classe aleatória é pseudo-aleatório, ou seja, aleatório com regras. Ao realizar randomização, o número de origem do algoritmo aleatório é chamado de sementes, que executa uma certa transformação com base nas sementes, gerando assim os números aleatórios necessários.
Objetos aleatórios com o mesmo número de sementes, os números aleatórios gerados pelo mesmo número de vezes são exatamente os mesmos. Em outras palavras, para dois objetos aleatórios com o mesmo número de sementes, os números aleatórios gerados pela primeira vez são exatamente os mesmos, e os números aleatórios gerados pela segunda vez são exatamente os mesmos. Isso requer atenção especial ao gerar vários números aleatórios.
A seguir, descreve o uso da classe aleatória, bem como como gerar uma matriz aleatória de intervalos especificados e as chances necessárias no programa de implementação.
1. Geração de objetos aleatórios
A classe aleatória contém dois construtores, que são introduzidos na sequência abaixo:
um. public Random ()
Esse método de construção usa um número relacionado ao tempo relativo correspondente ao tempo atual do sistema como número de semente e, em seguida, usa esse número de semente para construir o objeto aleatório.
b. Public Random (semente longa)
Este construtor pode ser criado formulando um número de semente.
Código de exemplo:
A cópia do código é a seguinte:
Aleatório r = novo aleatório ();
Aleatório r1 = novo aleatório (10);
Novamente: o número de sementes é apenas o número de origem do algoritmo aleatório e não tem nada a ver com o intervalo dos números aleatórios gerados.
2. Métodos comuns em classe aleatória
Os métodos na classe aleatória são relativamente simples e as funções de cada método também são fáceis de entender. Deve -se notar que os números aleatórios gerados por cada método na classe aleatória são distribuídos uniformemente, o que significa que a probabilidade de geração numérica dentro do intervalo é igual. Aqui está uma introdução básica a esses métodos:
um. Public Boolean NextBoolean ()
A função desse método é gerar um valor booleano aleatório, e a probabilidade de gerar valores verdadeiros e falsos é igual, ou seja, ambos são 50%.
b. Public Double NextDouble ()
O objetivo deste método é gerar um valor duplo aleatório, com o valor entre [0, 1.0).
C, Public int NextInt ()
O objetivo deste método é gerar um valor INT aleatório, entre -231 e 231-1.
Se você precisar gerar um valor int para um intervalo especificado, precisará executar uma certa transformação matemática. Para detalhes, consulte o código no exemplo de uso abaixo.
D, Public int NextInt (int n)
A função desse método é gerar um valor INT aleatório, que está dentro do intervalo de [0, n), ou seja, um valor de int aleatório entre 0 e n, contendo 0, mas não n.
Se você deseja gerar um valor int para um intervalo especificado, também precisa executar uma certa transformação matemática. Para detalhes, consulte o código no exemplo de uso abaixo.
E, Seteed de vazio público (semente longa)
O objetivo deste método é redefinir o número de sementes no objeto aleatório. Depois de definir o número de sementes, o objeto aleatório é o mesmo que o objeto aleatório criado com a nova palavra -chave.
3. Exemplo de uso de classe aleatória
Usando a classe aleatória, geralmente é gerar números aleatórios para um intervalo especificado. O seguinte introduzirá como gerar números aleatórios para um intervalo correspondente um por um. Os códigos a seguir que geram números aleatórios são gerados usando o seguinte objeto aleatório R:
Aleatório r = novo aleatório ();
um. Gerar decimais do intervalo [0, 1.0)
A cópia do código é a seguinte:
duplo d1 = r.nextDouble ();
É obtido diretamente usando o método NextDouble.
b. Gerar decimais do intervalo [0,5.0)
A cópia do código é a seguinte:
duplo d2 = r.nextDouble () * 5;
Como o intervalo numérico gerado pelo método NextDouble é [0, 1.0), a expansão do intervalo em 5 vezes é o intervalo necessário.
Da mesma forma, para gerar um decimal aleatório no intervalo [0, d) e D é qualquer decimal positivo, você só precisa multiplicar o valor de retorno do método NextDouble por d.
c. Gerar decimais no intervalo [1,2,5)
A cópia do código é a seguinte:
duplo d3 = r.nextDouble () * 1,5 + 1;
Para gerar um decimal aleatório do intervalo [1, 2.5), você só precisa gerar primeiro um número aleatório do intervalo [0, 1.5) e depois adicionar 1 ao intervalo de número aleatório gerado.
Da mesma forma, para gerar qualquer número aleatório na faixa de intervalo decimal [D1, D2) que não começa a partir de 0 (onde D1 não é igual a 0), você só precisa gerar primeiro um número aleatório no intervalo [0, D2-D1) e depois adicionar o intervalo de número aleatório gerado a D1.
d. Gerar qualquer número inteiro
A cópia do código é a seguinte:
int n1 = r.nextint ();
Basta usar o método NextInt diretamente.
e. Gerar números inteiros em intervalo [0,10)
A cópia do código é a seguinte:
int n2 = r.nextint (10);
n2 = math.abs (r.nextint () % 10);
As duas linhas de código acima podem gerar números inteiros no intervalo [0,10).
A primeira implementação é implementada diretamente usando o método NextInt (int n) na classe aleatória.
Na segunda implementação, o método First Call NextInt () para gerar um número INT arbitrário. O intervalo gerado pela soma número de 10 é (-10,10) e, em seguida, encontre o valor absoluto do intervalo, e o intervalo obtido é [0,10).
Da mesma forma, para gerar números inteiros aleatórios em qualquer intervalo [0, n), você pode usar o seguinte código:
A cópia do código é a seguinte:
int n2 = r.nextint (n);
n2 = math.abs (r.nextint () % n);
f. Gerar números inteiros em intervalo [0,10]
A cópia do código é a seguinte:
int n3 = r.nextint (11);
n3 = math.abs (r.nextint () % 11);
Comparado com o intervalo inteiro, o intervalo [0,10] e o intervalo [0,11) são equivalentes; portanto, um número inteiro do intervalo [0,11) é gerado.
g. Gerar números inteiros no intervalo [-3,15)
A cópia do código é a seguinte:
int n4 = r.nextint (18) - 3;
n4 = math.abs (r.nextint () % 18) - 3;
Para gerar números inteiros aleatórios que não começam a partir de 0, você pode consultar a descrição acima do princípio da implementação do intervalo decimal que não começa a partir de 0.
H, chance de alcançar
A implementação da lógica do programa de acordo com uma certa chance também é um problema que pode ser resolvido pelo processamento aleatório. Aqui está um exemplo simples para demonstrar como implementar a lógica do acaso usando números aleatórios.
Na introdução do método anterior, os números gerados no método NextInt (int n) são uniformes, ou seja, as chances de geração de cada número dentro do intervalo são as mesmas. Então, se um número inteiro aleatório no intervalo [0,100) for gerado, as chances de cada número gerado devem ser as mesmas e, como existem 100 números inteiros no intervalo, as chances de cada número são 1%. De acordo com essa teoria, o problema de probabilidade no programa pode ser realizado.
Exemplo: gerar aleatoriamente um número inteiro que gera 1 com 55% de chance, 2 com 40% de chance e 3 com 5% de chance. O código implementado é o seguinte:
A cópia do código é a seguinte:
int n5 = r.nextint (100);
int m; // Número de resultado
if (n5 <55) {// o intervalo de 55 números, 55% de chance
m = 1;
} else if (n5 <95) {// [55,95), intervalo de 40 números, 40% de chance
m = 2;
}outro{
M = 3;
}
Como a probabilidade de cada número é de 1%, a probabilidade de qualquer intervalo de 55 dígitos é de 55%. Para a conveniência de escrever o código, todos os números inteiros no intervalo [0,55) são usados aqui, e o princípio subsequente é o mesmo.
Obviamente, o código aqui pode ser simplificado porque as chances são múltiplas de 5%, portanto, basta controlar as chances de 5%. A seguir, a implementação simplificada do código:
A cópia do código é a seguinte:
int n6 = r.nextint (20);
int m1;
if (n6 <11) {
m1 = 1;
} else if (n6 <19) {
m1 = 2;
}outro{
m1 = 3;
}
Dentro do programa, a lógica da probabilidade pode ser implementada de acordo com as instruções acima.
4. Outras questões
um. O problema do objeto aleatório com o mesmo número de semente
Como mencionado anteriormente, objetos aleatórios com o mesmo número de sementes têm os mesmos números aleatórios gerados pelo mesmo número de vezes. A seguir, o código de teste:
A cópia do código é a seguinte:
Aleatório r1 = novo aleatório (10);
R2 aleatório = novo aleatório (10);
for (int i = 0; i <2; i ++) {
System.out.println (r1.NextInt ());
System.out.println (r2.NextInt ());
}
Neste código, o número de sementes usadas pelos objetos R1 e R2 é 10, portanto os números aleatórios gerados pelo mesmo número de vezes são exatamente iguais.
Se você deseja evitar a situação em que os números aleatórios são os mesmos, é necessário observar que, não importa quantos números aleatórios você precise gerar no projeto, você pode usar apenas um objeto aleatório.
b. Sobre o método aleatório na aula de matemática
De fato, há também um método aleatório na aula de matemática. O trabalho desse método aleatório é gerar um decimal aleatório do intervalo [0, 1.0).
Ao ler o código -fonte da classe de matemática, podemos descobrir que o método aleatório na classe de matemática é implementado chamando diretamente o método NextDouble na classe aleatória.
Só que o método aleatório é chamado relativamente simples, muitos programadores estão acostumados a usar o método aleatório da classe de matemática para gerar números aleatórios.