¿Generar entero aleatorio de mínimo a máximo?

Quiero generar un entero aleatorio que sea:

  1. Dentro del rango [Min, Max] inclusive
  2. El rango puede ser [5,20], [-29, -3] o [-13, 13] (puede estar en cualquier rango, positivo o negativo o intermedio)
  3. El código funciona bien en Android

Lo que obtuve hasta ahora es esto, ¡pero parece que no funciona con rangos negativos!

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

preguntado el 28 de agosto de 11 a las 04:08

Usted [-3, -29] ​​está en una posición incorrecta si dice [Min, Max], -

No voté en contra, pero el código aún no es correcto con esto arreglado. También, [5, -13] también está mal. -

5 Respuestas

Estoy bastante seguro de que quieres

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

Sin embargo, debo señalar que el rango [-3, -29] ​​tiene sus mínimos y máximos invertidos. (Y lo mismo con [5, -13] como lo señaló Merlyn).

Si solo desea ingresar dos números para el rango, ayb, use el código

int Min = Math.min(a,b);
int Max = Math.max(a,b);

De esa forma no tendrás que preocuparte por el pedido. Esto incluso funcionará para a == b.

Respondido 28 ago 11, 08:08

Buena atrapada. No me di cuenta de eso. - Keith Irwin

Prueba esta

int min = -100;
int max = 100;
Random rand = new Random();
return rand.nextInt(max - min + 1) + min;

Respondido 28 ago 11, 08:08

/**
 * @param bound1 an inclusive upper or lower bound
 * @param bound2 an inclusive lower or upper bound
 * @return a uniformly distributed pseudo-random number in the range.
 */
public static int randomInRange(int bound1, int bound2) {
    int min = Math.min(bound1, bound2);
    int max = Math.max(bound1, bound2);
    return min + (int)(Math.random() * (max - min + 1));
}

Si la persona que llama puede garantizar que bound1 será menor o igual a bound2 de lo que puede omitir el paso de determinar los límites mínimo y máximo; p.ej

/**
 * @param min the inclusive lower bound
 * @param max the inclusive upper bound
 * @return a uniformly distributed pseudo-random number in the range.
 */
public static int randomInRange(int min, int max) {
    return min + (int)(Math.random() * (max - min + 1));
}

No lo he probado en Android, pero debería funcionar en cualquier plataforma Java o similar a Java que admita esos métodos de conformidad con las especificaciones estándar (Sun) de Java SE.

Respondido 28 ago 11, 08:08

¿Alguien ha mencionado que su mínimo y máximo están invertidos? Porque eso es lo que está arruinando su código.

EDITAR

La otra cosa que está estropeando su código: debería ser Min + no 1 +

Respondido 28 ago 11, 08:08

Se ha mencionado, pero no, eso no es lo que está arruinando su código. - Keith Irwin

editado para agregar sugerencias útiles reales en lugar de solo sarcasmo. Porque es fin de semana. - Malvolio

Simplemente calcularía la diferencia entre el ejemplo mínimo y máximo -30 y 30 para obtener: delta <- valor absoluto de (30 - (-30)) y luego busque un número aleatorio entre 0 y delta.

Ya hay una publicación relacionada con esto. luego traduce el número a lo largo de la recta numérica por tu constante min.

Si usa la clase Random: 1) se agrega a la ecuación aquí para Random.nextInt (someInt) porque nextInt devuelve: someVal <someInt, por lo que debe asegurarse de incluir los límites en la salida de las funciones.

Algo acerca de este código me hace ser cauteloso:

return min + 
(int)(Math.random() * (max - min + 1));
}

Al lanzar redondeo de dobles para lanzar a ints:

int someRandomDoubleRoundedToInteger = (int)(someDouble + 0.5)

¿Funciona? Esto es para mi beneficio, tal vez algunos otros novatos se diviertan, o tal vez cometí un error, así que:

vamos a elegir 1 y 10 para empezar. Elija un número entre 1 y 10 (inclusive) Yo elijo 10

Math.Random Excluye 0 y 1. por lo que 0.9999999999999999 * (10 - 1 + 1) = 9.999999999999999 se convierte en int, entonces lob off todo después de que el decimal produce 9 y agregamos 1 a 9 para devolver 10. (usando aleatorio cualquier valor de (. 9 a .999999999999) también producirá 10

Quiero elegir 1 entre 1 y 10.

En este caso, el método aleatorio saca su valor más cercano a cero, digamos: 0.00000000000000001 * (10 - 1 + 1) cast to int is zero 0 Devolvemos 1 + 0. Entonces eso funciona.

Eh, parece funcionar. Parece un sesgo muy, muy, muy menor en contra de 1, ya que nunca incluimos "0" como una posibilidad, pero debería ser aceptable.

El método funciona, si el generador aleatorio cubre uniformemente toda el área entre 0 y 1. ¿Cuántos números diferentes se pueden representar entre el intervalo {0,1}, están espaciados uniformemente?

Creo que funciona.

Respondido 06 Oct 11, 16:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.