Números aleatórios

em 17/09/2002 , por Paulo Silveira
Introdução
Neste pequeno tutorial, vamos entender como são gerados números aleatórios, e como fazer isto utilizando o que já existe na API do java. O java.util.Random é uma das poucas classes que estão neste pacote desde o JDK 1.0 sem ter nenhum método depreciado (deprecated) ou ter sido readaptado (retrofited). Dá para perceber a idade desta classe: se você abrir o código fonte desta classe, verá que ela é um pouco bagunçada, o javadoc muitas vezes põe o código do método dentro do comentário, inteiro; o código não segue as convenções de código da sun, em relação a identação e quebra de linhas; o próprio arquivo muda de convenção de um método para outro!
A semente
Antes de começar a estudá-la, vamos entender o que é uma semente (seed) de uma sequência de números aleatórios. Um computador não consegue gerar números aleatórios. Como assim? Ele não tem inteligência para "chutar" um número. Você precisa dar uma função (função matemática) para o computador, desta maneira ele pode calcular um número a partir dela. Mas o que aconteceria se sempre o mesmo X para o f(X) fosse usado? Sempre teriamos o mesmo número. Então, quando você usa uma vez a função, da próxima vez ele vai usar f(X+1) para calcular o próximo número (não é bem assim, mas é para ilustrar). Isso forma uma série de números. E se a função é "boa", esses números terão uma distribuição aceitável para dizermos que eles são aleatórios! Mas e a semente? Se a gente usar sempre a mesma função, teremos sempre a mesma sequência de números! Isso é muito inútil! Por isso, para esta função, você precisa de um número inicial, um número para começar a série, daí o termo "semente". Dada uma semente, geramos uma série de números aletórios. Se usarmos a mesma semente duas vezes, as sequências geradas são as mesmas.
Utilizando a API
Agora que já sabemos como funciona a semente de uma sequência de números aleatórios, podemos começar a demonstrar a API, que é muito simples:

Observação: em uma classe que vamos precisar gerar números aleatórios, é muito comum você ver essa variável sendo static, já que é muito comum ter mais de um gerador de números aleatórios por aplicação. Existe o construtor simples desta classe, que toma como semente o System.currentTimeMilis(), que devolve um long com o número de milisegundos desde 1970. Isso é bom porque a cada momento que passa, uma semente diferente vai ser utilizada.

Pronto. Para começarmos a tirar números aleatórios, podemos utilizar um dos métodos nextXXXX() que a classe possui. Porque next? Porque é o próximo número da sequência! Por exemplo:

Isto vai te gerar um long e um inteiro quaisquer. Se você quiser um número em um intervalo determinado, você precisaria tirar o resto com o operador %, ou utilizar o / e arredondar. Para o int, já existe um método:

Isto vai gerar um número entre 0 e 9. Nunca vai sair o número 10.
Conclusão
A utilização desta classe é muito simples, porém você sempre deve ter o cuidado de não inicializar duas delas ao mesmo tempo. Entender bem como uma semente funciona também é muito interessante, já que isto pode te proporcionar ter o mesmo efeito aleatório duas vezes! O mais importante aqui é você ter aprendido o conceito de semente, que é simples também.