args) { Random rng; rng = new Random(1234567890); // Gerando uma sequencia de numeros de 0 ate 19 for(int i = 0; i < 50; i++) { System.out.print(rng.nextInt(20) + " "); } System.out.print("\n"); rng.setSeed(1234567890); // Gerando a mesma sequencia de numeros de 0 ate 19 for(int i = 0; i < 50; i++) { System.out.print(rng.nextInt(20) + " "); } }}Como pode ser observado, este metodo possui uma forma muito mais intuitiva de geracao de numeros inteiros dentro de um conjunto pre definido, e por questoes de clareza e preferivel ao metodo anterior. Mas e importante lembrar de criar os controles para a manutencao da instancia do seu RNG, ou seja, nao e recomendavel criar um RNG a cada vez que precisar gerar um valor aleatorio.E, da mesma forma que no metodo anterior, caso seu sistema faca uso intenso de multithreading e geracao aleatoria a sua instancia do RNG pode ficar sobrecarregada e gerar contencao, mas isto e facilmente contornavel com a manutencao de mais de uma instancia de RNG, o que nao e possivel com o uso de Math.random.java.util.concurrent.ThreadLocalRandomCaso seu sistema faca uso de multithread e geracao aleatoria e possivel fazer uso desta classe especial que o Java fornece a partir da versao 1.7. Resumidamente, este classe e uma instancia da classe Random que e isolada em uma thread, que nao pode ser instanciada e nem pode ter sua semente definida. Para fazer uso dela basta chamar ThreadLocalRandom.current() e o seu metodo preferido.java.security.SecureRandomEsta classe respeita alguns conceitos de seguranca criptografica e tenta obter uma sequencia nao deterministica e forte o bastante. O RNG obtido por esta classe vai depender da implementacao do runtime Java e podera fazer uso de recursos criptograficos do sistema operacional ou do hardware onde esta sendo executado, por exemplo, no Linux o runtime podera utilizar o gerador do SO baseado na chamada /dev/random.Valores aleatorios versus SegurancaTudo depende do objetivo que os valores aleatorios sao necessarios. Para sistemas simples, onde algum nivel de aleatoriedade e requisito, como em jogos, e a previsibilidade destes valores nao afeta o comportamento geral dos usuarios, entao os metodos nao seguros sao suficientes. Ja em sistemas onde a previsibilidade dos valores e uma fator essencial na seguranca, entao um metodo seguro deve ser utilizado.Mas nao fique tentado a utilizar apenas metodos seguros, pois esta seguranca tem um preco, e o preco e no desempenho, metodos que dependam do SO podem sofrer contencao fora do controle do seu sistema.Bem, meu objetivo e um entendimento geral dos recursos, entao, caso voce precise de geracao em nivel criptografico recomendo uma leitura mais aprofundada nos artigos disponiveis na internet ou em livros, mas algumas dicas a serem seguidas:- Utilize a classe SecureRandom com o Java mais recente possivel;- Redefina a semente com alguma frequencia, ou por tempo ou valores obtidos;- Redefina a semente com valores de dificil previsao;- Nao armazene rastros que possam levar as sementes, como logs.Obs.: Utilize a classe SecureRandom somente se for essencial, as outras dicas acima tambem podem ser utilizadas com a classe Random.Para exemplificar, vai um codigo de um gerador de inteiros com