¿Cómo genero un int
valor 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
max
valor esInteger.MAX_VALUE
posible, 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?ThreadLocalRandom
se 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
nextInt
enfoque, 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
Max
y está obteniendo un doble valor. Para obtener elMax
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:Y ahí lo tienes. Un valor entero aleatorio en el rango
[Min,Max]
, o según el ejemplo[5,10]
:fuente
Utilizar:
El entero
x
ahora 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 laRandom
clase.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
IntStream
generado (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
double
ylong
valores. ¡Espero que ayude! :)fuente
streamSize
? El primer parámetro de este método dadostreamSize !=0
. ¿Cuál es la diferencia sistreamSize
se 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
Random
fuente
ThreadLocalRandom
equivalente de clasejava.util.Random
para 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.Random
clase en Java está basada en 0. Entonces, si escribes algo como esto:x
será entre0-9
inclusivo.Entonces, dada la siguiente matriz de
25
elementos, el código para generar un número aleatorio entre0
(la base de la matriz) yarray.length
sería:Como
i.length
regresará25
,nextInt( i.length )
devolverá un número entre el rango de0-24
. La otra opción va con laMath.Random
que funciona de la misma manera.Para una mejor comprensión, consulte la publicación en el foro Random Intervals (archive.org) .
fuente
index
variable 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 cuandomin
es negativo.Una solución infalible devolvería resultados correctos para cualquiera
min <= max
dentro 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
while
ciclo 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.nextInt
oRandomDataGenerator.nextLong
fuente
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
SplittableRandom
que generalmente es más rápido, tiene una mejor independencia estadística y propiedades de uniformidad en comparación conRandom
.Para generar un azar
int
en 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.parallel
procesamiento). Por cierto, para una variedad de1_000_000
elementos, laparallel
versió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 + 1
será 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
ints
en 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 directamentesetSeed
es 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 propiaSecureRandom
instancia 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 true
Puede reutilizarlo como campo en la clase de hoyo, también teniendo todos
Random.class
métodos en un solo lugarEjemplo de resultados:
Fuentes:
fuente
Esto está funcionando bien.
fuente