¿Cómo genero un intvalor aleatorio en un rango específico?
He intentado lo siguiente, pero esos no funcionan:
Intento 1:
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
Intento 2:
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.

Respuestas:
En Java 1.7 o posterior , la forma estándar de hacerlo es la siguiente:
Consulte el JavaDoc relevante . Este enfoque tiene la ventaja de no necesitar inicializar explícitamente una instancia de java.util.Random , que puede ser una fuente de confusión y error si se usa de manera inapropiada.
Sin embargo, a la inversa, no hay forma de establecer explícitamente la semilla, por lo que puede ser difícil reproducir resultados en situaciones en las que eso es útil, como probar o guardar estados de juego o similares. En esas situaciones, se puede utilizar la técnica anterior a Java 1.7 que se muestra a continuación.
Antes de Java 1.7 , la forma estándar de hacerlo es la siguiente:
Consulte el JavaDoc relevante . En la práctica, la clase java.util.Random a menudo es preferible a java.lang.Math.random () .
En particular, no es necesario reinventar la rueda de generación de enteros aleatorios cuando hay una API sencilla dentro de la biblioteca estándar para realizar la tarea.
fuente
maxvalor esInteger.MAX_VALUEposible, se puede desbordar, lo que resulta en ajava.lang.IllegalArgumentException. Usted puede tratar con:randInt(0, Integer.MAX_VALUE). Además, sinextInt((max-min) + 1)devuelve el valor más alto (bastante raro, supongo), ¿no se desbordará nuevamente (suponiendo que min y max son valores lo suficientemente altos)? ¿Cómo lidiar con este tipo de situaciones?ThreadLocalRandomse agregó a Java 2 años y medio después de esta pregunta por primera vez. Siempre he tenido la firme opinión de que la gestión de la instancia aleatoria está fuera del alcance de la pregunta.Tenga en cuenta que este enfoque es más parcial y menos eficiente que un
nextIntenfoque, https://stackoverflow.com/a/738651/360211Un patrón estándar para lograr esto es:
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.
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 usarEsto 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.
Ahora obtendrá un valor en el rango
[Min,Max). Siguiendo nuestro ejemplo, eso significa[5,10):Pero, esto todavía no incluye
Maxy está obteniendo un doble valor. Para obtener elMaxvalor 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:Y ahí lo tienes. Un valor entero aleatorio en el rango
[Min,Max], o según el ejemplo[5,10]:fuente
Utilizar:
El entero
xahora es el número aleatorio que tiene un posible resultado de5-10.fuente
Utilizar:
fuente
Con java-8introdujeron el método
ints(int randomNumberOrigin, int randomNumberBound)en laRandomclase.Por ejemplo, si desea generar cinco enteros aleatorios (o uno solo) en el rango [0, 10], simplemente haga:
El primer parámetro indica solo el tamaño del
IntStreamgenerado (que es el método sobrecargado del que produce un ilimitadoIntStream).Si necesita hacer varias llamadas por separado, puede crear un iterador primitivo infinito a partir de la secuencia:
También puedes hacerlo por
doubleylongvalores. ¡Espero que ayude! :)fuente
streamSize? El primer parámetro de este método dadostreamSize !=0. ¿Cuál es la diferencia sistreamSizese da 1/2 / n?Puede editar su segundo ejemplo de código para:
fuente
Solo una pequeña modificación de su primera solución sería suficiente.
Ver más aquí para la implementación de
Randomfuente
ThreadLocalRandomequivalente de clasejava.util.Randompara entorno multiproceso. La generación de un número aleatorio se lleva a cabo localmente en cada uno de los hilos. Entonces tenemos un mejor desempeño al reducir los conflictos.x,y- intervalos, p. ej. (1,10)fuente
La
Math.Randomclase en Java está basada en 0. Entonces, si escribes algo como esto:xserá entre0-9inclusivo.Entonces, dada la siguiente matriz de
25elementos, el código para generar un número aleatorio entre0(la base de la matriz) yarray.lengthsería:Como
i.lengthregresará25,nextInt( i.length )devolverá un número entre el rango de0-24. La otra opción va con laMath.Randomque funciona de la misma manera.Para una mejor comprensión, consulte la publicación en el foro Random Intervals (archive.org) .
fuente
indexvariable no afectará el resultado del número aleatorio. Puede optar por inicializarlo de la forma que desee sin tener que preocuparse por cambiar el resultado. Espero que esto ayude.int index = rand.nextInt(i.Length);int index; \n index = rand...si a uno le gustan las declaraciones y asignaciones en diferentes líneas. Algunos estándares de codificación son más estrictos (y sin un propósito aparente) que otros.Perdóname por ser fastidioso, pero la solución sugerida por la mayoría, es decir
min + rng.nextInt(max - min + 1)), parece peligrosa debido al hecho de que:rng.nextInt(n)no puede alcanzarInteger.MAX_VALUE.(max - min)puede causar desbordamiento cuandomines negativo.Una solución infalible devolvería resultados correctos para cualquiera
min <= maxdentro de [Integer.MIN_VALUE,Integer.MAX_VALUE]. Considere la siguiente implementación ingenua:Aunque ineficiente, tenga en cuenta que la probabilidad de éxito en el
whileciclo siempre será del 50% o más.fuente
Se puede hacer simplemente haciendo la declaración:
A continuación se muestra su código fuente
Randomizer.java
Es simplemente limpio y simple.
fuente
Me pregunto si alguno de los métodos de generación de números aleatorios proporcionados por un Apache Commons Math biblioteca de encajaría bien
Por ejemplo:
RandomDataGenerator.nextIntoRandomDataGenerator.nextLongfuente
Pongamos un ejemplo.
Supongamos que deseo generar un número entre 5-10 :
Déjanos entender esto ...
fuente
fuente
Genere un número aleatorio para la diferencia de min y max utilizando el método nextint (n) y luego agregue un número min al resultado:
fuente
Yo uso esto:
Puedes convertirlo en un entero si quieres.
fuente
new Random(verifique el JavaDoc): "Crea un nuevo generador de números aleatorios. Este constructor establece la semilla del generador de números aleatorios en un valor muy probable que sea distinto de cualquier otra invocación de este constructor". Es muy probable que solo implique el uso del tiempo actual como semilla. Si ese tiempo usa milisegundos, las computadoras actuales son lo suficientemente rápidas como para generar el mismo número. Pero además de eso 2147483647 esInteger.MAX_VALUE; la salida obviamente depende de la entrada, que no ha especificado.Joshua Bloch. Java efectivo Tercera edicion.
A partir de Java 8
Para grupos de unión de fork y flujos paralelos, el uso
SplittableRandomque generalmente es más rápido, tiene una mejor independencia estadística y propiedades de uniformidad en comparación conRandom.Para generar un azar
inten el rango[0, 1_000]:Para generar una
int[100]matriz aleatoria de valores en el rango[0, 1_000]:Para devolver una secuencia de valores aleatorios:
fuente
.parallel()? Me parece que generar 100 números aleatorios sería demasiado trivial para justificar el paralelismo.parallelprocesamiento). Por cierto, para una variedad de1_000_000elementos, laparallelversión fue 2 veces más rápida en mi máquina en comparación con la secuencial.Solo usa la clase Random :
fuente
Estos métodos pueden ser convenientes de usar:
Este método devolverá un número aleatorio entre el valor mínimo y máximo proporcionados:
y este método devolverá un número aleatorio del valor mínimo y máximo proporcionados (por lo que el número generado también podría ser el número mínimo o máximo):
fuente
// Since the random number is between the min and max values, simply add 1. ¿Por qué? ¿Min no cuenta? Por lo general, el rango es [min, max) donde se incluye min y se excluye max. Respuesta incorrecta, rechazada.min + 1será el doble de probable que el otro número como resultadogetRandomNumberBetween!En caso de tirar un dado, sería un número aleatorio entre 1 y 6 (no entre 0 y 6), así que:
fuente
O eche un vistazo a RandomUtils de Apache Commons .
fuente
Double.valueOf(Math.random()*(maximum-minimun)).intValue()es una manera bastante ofuscada (e ineficiente) de decir(int)(Math.random()*(maximum-minimun))...Aquí hay una clase útil para generar al azar
intsen un rango con cualquier combinación de límites inclusivos / exclusivos:fuente
Para generar un número aleatorio "entre dos números", use el siguiente código:
Esto le da un número aleatorio entre 1 (inclusive) y 11 (exclusivo), así que inicialice el valor upperBound sumando 1. Por ejemplo, si desea generar un número aleatorio entre 1 y 10, inicialice el número upperBound con 11 en lugar de 10)
fuente
Puede lograrlo de manera concisa en Java 8:
fuente
fuente
Otra opción es simplemente usar Apache Commons :
fuente
Encontré este ejemplo Generar números aleatorios :
Este ejemplo genera enteros aleatorios en un rango específico.
Un ejemplo de ejecución de esta clase:
fuente
Es mejor usar SecureRandom en lugar de solo Random.
fuente
private static int SecureRandom rand = new SecureRandom();2:static {3:rand.setSeed(...);4:}SecureRandom, será sembrado por el sistema. Llamar directamentesetSeedes muy peligroso, puede reemplazar la semilla (realmente aleatoria) con la fecha. Y eso ciertamente no dará como resultado unaSecureRandom, ya que cualquiera puede adivinar el tiempo e intentar sembrar su propiaSecureRandominstancia con esa información.Aquí hay una muestra simple que muestra cómo generar un número aleatorio de cerrado
[min, max]rango , mientrasmin <= max is truePuede reutilizarlo como campo en la clase de hoyo, también teniendo todos
Random.classmétodos en un solo lugarEjemplo de resultados:
Fuentes:
fuente
Esto está funcionando bien.
fuente