1607 votos

La generación aleatoria de números enteros en un rango con Java

Estoy tratando de generar un entero aleatorio con Java, pero al azar dentro de un rango determinado. Por ejemplo, mi rango es de 5 a 10, lo que significa que el 5 es el menor valor posible el número aleatorio puede tomar, y 10 es el más grande. Cualquier otro número entre estos números es posible ser un valor, también.

En Java, existe un método random() de la Math clase, que devuelve un double valor entre 0.0 y 1.0. En la clase Random hay un método nextInt(int n), que devuelve un valor entero aleatorio en el rango de 0 (inclusive) y n (exclusivo). No pude encontrar un método que devuelve un valor entero aleatorio entre dos números.

He probado las siguientes cosas, pero todavía tengo problemas: (mínimo y máximo son los más pequeños y los mayores números).

Solución 1:

randomNum = minimum + (int)(Math.random()*maximum); 

Problema: randomNum es assinged los valores de los números más grande que maximum.

Solución 2:

Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum =  minimum + i;

Problema: randomNum se asigna valores inferiores minimum.

¿Cómo puedo resolver este problema?

He probado también la navegación por el archivo y encontré:

Pero yo no podía resolver el problema.

1832voto

Greg Case Puntos 10300

La forma estándar de hacerlo es la siguiente:

/**
 * Returns a pseudo-random number between min and max, inclusive.
 * The difference between min and max can be at most
 * <code>Integer.MAX_VALUE - 1</code>.
 *
 * @param min Minimum value
 * @param max Maximum value.  Must be greater than min.
 * @return Integer between min and max, inclusive.
 * @see java.util.Random#nextInt(int)
 */
public static int randInt(int min, int max) {

    // NOTE: Usually this should be a field rather than a method
    // variable so that it is not re-seeded every call.
    Random rand = new Random();

    // nextInt is normally exclusive of the top value,
    // so add 1 to make it inclusive
    int randomNum = rand.nextInt((max - min) + 1) + min;

    return randomNum;
}

Ver la pertinente JavaDoc. En la práctica, la java.util.Random clase es a menudo preferible a java.lang.Math.random().

En particular, no hay necesidad de reinventar el entero aleatorio de generación de la rueda cuando hay un sencillo API dentro de la biblioteca estándar para realizar la tarea.

1024voto

TJ_Fischer Puntos 9042

Un patrón estándar para el logro de esto es:

Min + (int)(Math.random() * ((Max - Min) + 1))

El Java de Matemáticas de la biblioteca de la función Math.random() genera un doble valor en el rango [0,1). Aviso de este intervalo no incluye el 1.

Con el fin de obtener un rango específico de valores en primer lugar, es necesario multiplicar por la magnitud de la gama de valores que usted 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 desea que [5,10], que necesita cubrir cinco valores enteros para utilizar

Math.random() * 5

Se devuelve un valor en el rango [0,5), donde el 5 no está incluido.

Ahora lo que necesita a cambio de este rango hasta el rango que se desea representar. Puede hacerlo agregando el valor Min.

Min + (Math.random() * (Max - Min))

Ahora, usted va a obtener un valor en el intervalo [Min,Max). Siguiendo nuestro ejemplo, esto significa que [5,10):

5 + (Math.random() * (10 - 5))

Pero, esto aún no incluya Max y está recibiendo un doble valor. Con el fin de obtener el Max valor incluido, debe agregar 1 para el parámetro de intervalo (Max - Min) y, a continuación, trunca la parte decimal, echando a un int. Esto se logra a través de:

Min + (int)(Math.random() * ((Max - Min) + 1))

Y ahí lo tienen. Un valor entero aleatorio en el intervalo [Min,Max], o por el ejemplo, [5,10]:

5 + (int)(Math.random() * ((10 - 5) + 1))

56voto

krosenvold Puntos 35979

Uso:

minimum + rn.nextInt(maxValue - minvalue + 1)

47voto

Bill the Lizard Puntos 147311

Usted puede editar su segundo ejemplo de código:

Random rn = new Random();
int range = maximum - minimum + 1;
int randomNum =  rn.nextInt(range) + minimum;

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X