Há várias formas de gerar valores aleatórios em Java.
Random
A classe java.util.Random disponibiliza 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 predefinido, a classe Random tem também outro construtor onde se pode indicar uma semente personalizada.
Se criares duas instâncias de Random com a mesma semente e fizeres a mesma sequência de chamadas de métodos em cada uma delas, vão gerar e devolver 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 a java.util.Random e foi concebida para ser thread-safe.
Esta classe tem alguns métodos utilitários extra para gerar valores que recebem tanto um limite inferior como um limite superior, o que torna o seu uso um pouco mais simples.
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
Os valores aleatórios são usados frequentemente para gerar valores sensíveis, como palavras-passe. 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, usa a classe java.security.SecureRandom.