Existem várias formas de gerar valores aleatórios em Java.
Random
A classe java.util.Random oferece vários métodos para gerar valores pseudoaleatórios.
Random random = new Random();
random.next(8); // Generates a random int with the given number of bits, in this case 8
random.nextInt(); // Generates a random int in the range Integer.MIN_VALUE through Integer.MAX_VALUE
random.nextInt(10); // Generates a random int in the range 0 to 10
random.nextFloat(); // Generates a random float in the range 0.0 to 1.0
random.nextDouble(); // Generates a random double in the range 0.0 to 1.0
random.nextBoolean(); // Generates a random boolean value
random.nextLong(); // Generates a random long value
Além do seu construtor padrão, a classe Random também tem outro construtor no qual é possível fornecer uma semente personalizada.
Se duas instâncias de Random forem criadas com a mesma semente, e a mesma sequência de chamadas de método for feita em cada uma, elas vão gerar e retornar sequências de números idênticas.
Math.random()
O método Math.random() é um método utilitário para gerar um Double aleatório no intervalo de 0.0 a 1.0.
ThreadLocalRandom
A classe java.util.concurrent.ThreadLocalRandom é uma alternativa ao java.util.Random e foi projetada para ser thread-safe.
Essa classe tem alguns métodos utilitários extras para gerar valores que recebem tanto um limite inferior quanto um superior, o que a torna um pouco mais fácil de usar.
ThreadLocalRandom random = ThreadLocalRandom.current();
random.nextInt(10, 20); // Generates a random int in the range 10 to 20
random.nextLong(10, 20); // Generates a random long in the range 10 to 20
random.nextFloat(10.0, 20.0); // Generates a random float in the range 10 to 20
random.nextDouble(10.0, 20.0); // Generates a random double in the range 10 to 20
Valores aleatórios costumam ser usados para gerar valores sensíveis, como senhas. No entanto, todos os métodos para gerar valores aleatórios descritos acima não são considerados criptograficamente seguros.
Para gerar números aleatórios criptograficamente fortes, use a classe java.security.SecureRandom.