Pamiętaj, że to podejście jest bardziej stronnicze i mniej wydajne niż nextInt
podejście, https://stackoverflow.com/a/738651/360211
Jednym standardowym wzorcem do osiągnięcia tego jest:
Min + (int)(Math.random() * ((Max - Min) + 1))
Funkcja biblioteczna Java Math Math.random () generuje podwójną wartość w zakresie [0,1)
. Zauważ, że ten zakres nie obejmuje 1.
Aby najpierw uzyskać określony zakres wartości, należy pomnożyć przez wielkość zakresu wartości, które chcesz uwzględnić.
Math.random() * ( Max - Min )
Zwraca wartość z zakresu [0,Max-Min)
, w którym nie jest uwzględnione „Max-Min”.
Na przykład, jeśli chcesz [5,10)
, musisz podać pięć wartości całkowitych, abyś mógł użyć
Math.random() * 5
Zwróciłoby to wartość z zakresu [0,5)
, w którym 5 nie jest uwzględnione.
Teraz musisz przesunąć ten zakres do zakresu, na który celujesz. Robisz to, dodając wartość Min.
Min + (Math.random() * (Max - Min))
Otrzymasz teraz wartość z zakresu [Min,Max)
. Idąc za naszym przykładem, oznacza to [5,10)
:
5 + (Math.random() * (10 - 5))
Ale to wciąż nie obejmuje Max
i dostajesz podwójną wartość. Aby uwzględnić Max
wartość, musisz dodać 1 do parametru zakresu, (Max - Min)
a następnie skrócić część dziesiętną, rzutując na liczbę całkowitą. Odbywa się to poprzez:
Min + (int)(Math.random() * ((Max - Min) + 1))
I masz to. Losowa wartość całkowita w zakresie [Min,Max]
lub na przykład [5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))