Números aleatórios em Java: do caos à ordem
\n\nOlá, futuro javaísta! Se você já escreveu jogos, simulações, testes ou apenas quis adicionar um elemento de surpresa ao seu programa, certamente já precisou obter um número inteiro aleatório em um intervalo determinado. Parece simples, não é? Mas na prática, iniciantes frequentemente se perguntam: "Por que estou recebendo números de 0 a 100, e não de 50 a 100?" ou "Por que meu código está dando erro?".
\n\nHoje vamos resolver esse assunto de uma vez por todas. Você aprenderá como gerar um número aleatório em Java em qualquer intervalo, usando três abordagens principais. Spoiler: uma delas é a melhor escolha para 90% dos casos. Vamos lá!
\n\nPor que isso é importante?
\nA geração de números aleatórios é uma tarefa básica, mas criticamente importante. Não há como evitar ao:
\n- \n
- Criar dados de teste (por exemplo, IDs de usuários). \n
- Implementar mecânicas de jogo (drop de itens, geração de níveis). \n
- Simular processos aleatórios (filas, tráfego). \n
- Selecionar um elemento aleatório de uma lista. \n
Dominando este tópico, você deixará de temer a "mágica" no código e poderá controlar a aleatoriedade com confiança.
\n\nMétodo nº1: O clássico — java.util.Random
\nEste é o avô de todos os geradores em Java. A classe java.util.Random existe desde as primeiras versões e ainda é amplamente utilizada. Sua principal vantagem é a versatilidade.
Como obter um int aleatório de 0 a N?
\nO método nextInt(int bound) retorna um número aleatório de 0 (inclusivo) até bound (exclusivo). Ou seja, se você escrever nextInt(10), obterá um número de 0 a 9.
import java.util.Random;\n\npublic class RandomExample {\n public static void main(String[] args) {\n Random random = new Random();\n int number = random.nextInt(10); // 0..9\n System.out.println("Número aleatório: " + number);\n }\n}\n\nE como fazer de 5 a 15?
\nAqui está o segredo principal. Para obter um número em um intervalo arbitrário [min, max], você precisa usar a fórmula:
min + random.nextInt(max - min + 1)
Vamos analisar com o exemplo: intervalo de 5 a 15.
\n- \n
max - min + 1= 15 - 5 + 1 = 11. EntãonextInt(11)dará números de 0 a 10. \n - Adicionamos
min(5): obtemos o intervalo 5..15. \n
Verificamos: se nextInt(11) retornou 0, então 0+5 = 5. Se retornou 10, então 10+5 = 15. Perfeito!
Random random = new Random();\nint min = 5;\nint max = 15;\nint randomNumber = min + random.nextInt(max - min + 1);\nSystem.out.println("Número aleatório de 5 a 15: " + randomNumber);\n\nImportante: Não se esqueça do +1! Sem ele, o valor máximo será 1 a menos.
Método nº2: Abordagem moderna — ThreadLocalRandom
\nA partir do Java 7, surgiu a classe ThreadLocalRandom. Ela é especialmente otimizada para aplicações multithread (mas funciona muito bem também em single-thread). A principal vantagem é que é mais rápida que Random e não requer a criação de um objeto separado.
Uso em código single-thread
\nEla possui um método conveniente nextInt(int origin, int bound) que já aceita os limites do intervalo! Observe: origin é inclusivo, bound é exclusivo. Se você precisar incluir também o limite superior, basta adicionar +1.
import java.util.concurrent.ThreadLocalRandom;\n\npublic class ThreadLocalRandomExample {\n public static void main(String[] args) {\n // Número de 5 a 15 (inclusivo)\n int randomNumber = ThreadLocalRandom.current().nextInt(5, 16);\n System.out.println("Número aleatório: " + randomNumber);\n }\n}\n\nViu como é simples? Sem fórmulas,