Observe que essa abordagem é mais tendenciosa e menos eficiente do que uma nextInt
abordagem, https://stackoverflow.com/a/738651/360211
Um padrão padrão para realizar isso é:
Min + (int)(Math.random() * ((Max - Min) + 1))
A função da biblioteca Java Math Math.random () gera um valor duplo no intervalo [0,1)
. Observe que esse intervalo não inclui o 1.
Para obter um intervalo específico de valores primeiro, você precisa multiplicar pela magnitude do intervalo de valores que deseja cobrir.
Math.random() * ( Max - Min )
Isso retorna um valor no intervalo [0,Max-Min)
, em que 'Max-Min' não está incluído.
Por exemplo, se você quiser [5,10)
, precisará cobrir cinco valores inteiros para usar
Math.random() * 5
Isso retornaria um valor no intervalo [0,5)
, em que 5 não está incluído.
Agora você precisa mudar esse intervalo para o que você está segmentando. Você faz isso adicionando o valor mínimo.
Min + (Math.random() * (Max - Min))
Agora você receberá um valor no intervalo [Min,Max)
. Seguindo o nosso exemplo, isso significa [5,10)
:
5 + (Math.random() * (10 - 5))
Mas, isso ainda não inclui Max
e você está recebendo um valor duplo. Para Max
incluir o valor, você precisa adicionar 1 ao parâmetro range (Max - Min)
e truncar a parte decimal convertendo para int. Isso é realizado via:
Min + (int)(Math.random() * ((Max - Min) + 1))
E aí está. Um valor inteiro aleatório no intervalo [Min,Max]
ou pelo exemplo [5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))