Generando números aleatorios únicos en Java
Estoy intentando obtener números aleatorios entre 0 y 100. Pero quiero que sean únicos, no repetidos en una secuencia. Por ejemplo, si obtuve 5 números, deberían ser 82,12,53,64,32 y no 82,12,53,12,32. Usé esto, pero genera los mismos números en una secuencia.
Random rand = new Random();
selected = rand.nextInt(100);
- Agregue cada número en el rango secuencialmente en una estructura de lista .
- Mézclalo .
- Tome la primera 'n'.
Aquí hay una implementación simple. Esto imprimirá 3 números aleatorios únicos del rango del 1 al 10.
import java.util.ArrayList;
import java.util.Collections;
public class UniqueRandomNumbers {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i=1; i<11; i++) list.add(i);
Collections.shuffle(list);
for (int i=0; i<3; i++) System.out.println(list.get(i));
}
}
La primera parte de la solución con el enfoque original, como señaló Mark Byers en una respuesta ahora eliminada, es usar solo una Random
instancia.
Eso es lo que hace que los números sean idénticos. Una Random
instancia se inicializa según la hora actual en milisegundos. Para un valor inicial particular, la instancia 'aleatoria' devolverá exactamente la misma secuencia de números pseudoaleatorios .
Con Java 8+, puede utilizar el ints
método para Random
obtener IntStream
valores aleatorios distinct
y luego limit
reducir la secuencia a una cantidad de valores aleatorios únicos.
ThreadLocalRandom.current().ints(0, 100).distinct().limit(5).forEach(System.out::println);
Random
también tiene métodos que crean LongStream
s y DoubleStream
s si los necesita.
Si desea que todos (o una gran cantidad) de los números en un rango estén en orden aleatorio, podría ser más eficiente agregar todos los números a una lista, mezclarlos y tomar la primera n porque el ejemplo anterior está implementado actualmente. generando números aleatorios en el rango solicitado y pasándolos a través de un conjunto (de manera similar a la respuesta de Rob Kielty ), lo que puede requerir generar muchos más que la cantidad pasada para limitar porque la probabilidad de generar un nuevo número único disminuye con cada uno encontrado. Aquí hay un ejemplo de la otra manera:
List<Integer> range = IntStream.range(0, 100).boxed()
.collect(Collectors.toCollection(ArrayList::new));
Collections.shuffle(range);
range.subList(0, 99).forEach(System.out::println);
- Crea una matriz de 100 números y luego aleatoriza su orden.
- Diseñe un generador de números pseudoaleatorios que tenga un rango de 100.
- Cree una matriz booleana de 100 elementos, luego establezca un elemento como verdadero cuando elija ese número. Cuando elija el siguiente número, verifique la matriz y vuelva a intentarlo si el elemento de la matriz está configurado. (Puede crear una matriz booleana fácil de borrar con una matriz
long
donde cambia y enmascara para acceder a bits individuales).