2012-02-24 18 views
6

Quiero crear 10 números aleatorios en el rango 0-500. Pero el problema es que quiero que esos números sean únicos. Para 2 números aleatorios que podría crear algo como lo siguiente:Generar un conjunto de números aleatorios únicos en Java

int randomItem1 = r.nextInt(500); 
int randomItem2 = r.nextInt(500); 
while(randomItem1==randomItem2){ 
    randomItem1=randomItem(); 
    randomItem2=randomItem(); 
} 

Pero si hago esto para el 10, creo que el tiempo que se acumulará. Y digo esto porque estoy tratando de crear un gran algoritmo que intenta hacer evaluaciones continuas y quiero tomar continuamente 10 números aleatorios y únicos. No se que hacer. Alguna idea o sugerencia?

+1

probar Google buscar primero http://www.wikihow.com/Generate-N-Different-Random-Numbers –

+1

Pero eso es un sitio terrible y la respuesta no está mal. – BCoates

+0

@MichaelT No lo dudo. El otro quiere * un * número en el rango, mientras que este quiere * números * múltiples en el rango. –

Respuesta

3

Hacer un LinkedList de los números del 1-500 y la aleatoria uno de ellos cada vez que utilice un número usando The Fisher-Yates shuffle.

Esto le dará un rendimiento de cuerdo garantizado (tiempo constante) para cada número extraído.

17

Parece que las está almacenando en variables individuales. El lugar "normal" para almacenar grupos de elementos como este normalmente estaría en una lista o matriz.

En este caso, guárdelos en una estructura de datos "set" en su lugar. No permitirá duplicados.

conjunto de documentación: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Set.html

Set set = new HashSet(); 

while (set.size() < 10) { 
    set.add(r.nextInt(500)); 
} 
+2

esta es una solución ordenada, más uno – davogotland

-1

Usaría una matriz y almacenaría los números a medida que se generan en esa matriz. Generarías un nuevo elemento aleatorio, luego necesitarías iterar a través de tu matriz hasta tu conteo de números, verificando si coincidía con alguno que hayas creado previamente.

+0

Eso sería un horrible diseño Necesidades de CPU indeterminadas. Las respuestas anteriores son mucho más precisas: crea un conjunto fuente de números elegibles, "baraja" y luego itera la lista aleatoria resultante. – RichieHH

+0

Para esta solución, creo que el principal problema sería escribir más código y no usar estructuras de datos fácilmente disponibles. Como no usaría una estructura de datos disponible, como un conjunto, pasaría más tiempo escribiendo y depurando el código. Dependiendo de su aplicación, no estoy seguro de preocuparme demasiado por las necesidades de la CPU, ya que el OP solo necesita 10 números aleatorios. Sin embargo, muchas de las estructuras de datos "configurables" fácilmente disponibles también se diseñarían usando algo más eficiente que el algoritmo O (n^2) que sugiere anteriormente. –

4

Java Collections tiene un método aleatorio. Puede poner sus números en una ArrayList y luego mezclar su contenido. Si ArrayList contiene n números, invocar el método aleatorio, le daría la misma ArrayList que contiene n números, pero dispuestos de forma aleatoria.

for(int i=0;i<10;i++){ 
list.add(i); // list contains: [0,1,2,3,4,5,6,7,8,9] 
} 
Collections.shuffle(list);// list now contains: [0, 9, 3, 1, 5, 8, 7, 2, 6, 4] 
Cuestiones relacionadas