Tenga en cuenta que este enfoque es más parcial y menos eficiente que un nextInt
enfoque, https://stackoverflow.com/a/738651/360211
Un patrón estándar para lograr esto es:
Min + (int)(Math.random() * ((Max - Min) + 1))
La función de la biblioteca Java Math Math.random () genera un valor doble en el rango [0,1)
. Tenga en cuenta que este rango no incluye el 1.
Para obtener primero un rango específico de valores, debe multiplicar por la magnitud del rango de valores que desea cubrir.
Math.random() * ( Max - Min )
Esto devuelve un valor en el rango [0,Max-Min)
, donde 'Max-Min' no está incluido.
Por ejemplo, si lo desea [5,10)
, debe cubrir cinco valores enteros para poder usar
Math.random() * 5
Esto devolvería un valor en el rango [0,5)
, donde 5 no está incluido.
Ahora necesita cambiar este rango al rango al que está apuntando. Para ello, agregue el valor mínimo.
Min + (Math.random() * (Max - Min))
Ahora obtendrá un valor en el rango [Min,Max)
. Siguiendo nuestro ejemplo, eso significa [5,10)
:
5 + (Math.random() * (10 - 5))
Pero, esto todavía no incluye Max
y está obteniendo un doble valor. Para obtener el Max
valor incluido, debe agregar 1 a su parámetro de rango (Max - Min)
y luego truncar la parte decimal mediante un int. Esto se logra a través de:
Min + (int)(Math.random() * ((Max - Min) + 1))
Y ahí lo tienes. Un valor entero aleatorio en el rango [Min,Max]
, o según el ejemplo [5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))