O que aprendemos com os livros?
A maneira mais óbvia e intuitiva é gerar números aleatórios em Java com uma chamada simples:
java.lang.math.random ()
Em todos os outros idiomas, gerar números aleatórios é como usar classes de ferramentas de matemática, como ABS, Pow, piso, SQRT e outras funções matemáticas. A maioria das pessoas aprende sobre essa categoria através de livros, tutoriais e cursos. Um exemplo simples: um número de ponto flutuante de precisão dupla pode ser gerada de 0,0 a 1,0. Então, através das informações acima, o desenvolvedor deseja gerar um número de ponto flutuante de precisão dupla entre 0,0 e 10,0 e escrevê-lo assim:
Math.Random () * 10
Se um número inteiro entre 0 e 10 for gerado, ele será escrito como:
Math.Round (Math.Random () * 10)
Avançado
Ao ler o código -fonte de math.random () ou simplesmente usar a função de conclusão automática do IDE, os desenvolvedores podem descobrir facilmente que java.lang.math.random () usa um objeto interno gerado aleatoriamente - um objeto muito poderoso pode ser aleatório flexível Geração: valores booleanos, todos os tipos numéricos e até distribuições gaussianas. Por exemplo:
New Java.util.Random (). NextInt (10)
Tem uma desvantagem, ou seja, é um objeto. Seu método deve ser chamado através de uma instância, o que significa que seu construtor deve ser chamado primeiro. Se houver memória suficiente, expressões como a acima são aceitáveis; mas quando houver memória insuficiente, isso causará problemas.
Uma solução simples que pode evitar criar uma nova instância toda vez que um número aleatório é usar uma classe estática. Você pode ter pensado em java.lang.math, muito bom, estamos melhorando a inicialização de java.lang.math. Embora esse projeto seja baixo, você também precisa fazer alguns testes de unidade simples para garantir que não dê errado.
Supondo que o programa precise gerar um número aleatório para armazenar, o problema ocorre novamente. Por exemplo, às vezes é necessário operar ou proteger sementes, e um número interno é usado para armazenar o estado e calcular o próximo número aleatório. Nesses casos especiais, é inapropriado compartilhar objetos gerados aleatoriamente.
simultâneo
No ambiente do aplicativo Java EE Multithread, os objetos de instância gerados aleatoriamente ainda podem ser armazenados em uma classe ou outra classe de implementação como uma propriedade estática. Felizmente, java.util.random é seguro para fios, portanto, não há risco de que várias chamadas de thread destruam a semente.
Outra coisa que vale a pena considerar é a instância multithread de java.lang.threadlocal. A abordagem preguiçosa é implementar uma única instância através da própria API Java.
Embora o Java não forneça uma boa maneira de gerenciar uma única instância de java.util.random. No entanto, o tão esperado Java 7 fornece uma nova maneira de gerar números aleatórios:
java.util.concurrent.threadlocalrandom.current (). nextInt (10)
Esta nova API combina as vantagens de duas outras abordagens: uma única instância/acesso estático, tão flexível quanto Math.Random (). Threadlocalrandom também é mais rápido do que qualquer outra maneira de lidar com alta simultaneidade.
experiência
Chris Marasti-Georg aponta:
Math.Round (Math.Random () * 10)
Torne a distribuição desequilibrada, por exemplo: 0,0 - 0,499999 irá arredondar para 0, enquanto 0,5 a 1,4999999 irá arredondar para 1. Então, como usar a sintaxe do estilo antigo para obter uma distribuição equilibrada correta, como segue:
Math.Floor (Math.random () * 11)
Felizmente, se usarmos java.util.random ou java.util.concurrent.threadlocalrandom, não precisamos nos preocupar com o exposto.
O projeto prático Java apresenta alguns dos danos de usar incorretamente a API java.util.random. Esta lição nos diz para não usar:
Math.abs (rnd.nextInt ())%n
E uso:
rnd.nextint (n)
Seu acima é uma introdução relacionada a N números aleatórios em Java, e espero que seja útil para o aprendizado de todos.