2011-12-07 9 views
9

¿Podría alguien decirme cómo puedo elegir varios números aleatorios diferentes de una matriz a la vez? Por ejemplo, hay una matriz int larga. Quiero elegir 7 números de él. Todos los números no deben ser iguales y ordenarlos por secuencia de aumento.Java: elija varios números aleatorios diferentes de la matriz al mismo tiempo

Random random = new Random(); 
int a = mixColor[random.nextInt(mixColor.length)]; 
int b = mixCoor[random.nextInt(mixCoor.length)]; 
int c = mixCoor[random.nextInt(mixCoor.length)]; 
int d = mixCoor[random.nextInt(mixCoor.length)]; 
int e = mixCoor[random.nextInt(mixCoor.length)]; 
while(b!=c && c!=d && b!=d) { 
    b = mixCoor[random.nextInt(mixCoor.length)]; 
    c = mixCoor[random.nextInt(mixCoor.length)]; 
    d = mixCoor[random.nextInt(mixCoor.length)]; 
} 

mixColor[] y mixCoor[] son largas matrices int. Puedo hacerlo de esta manera, pero si quiero elegir más números, esto será realmente complicado. Y necesito ordenarlos también. Alguien tiene buenas ideas?

+0

Dependiendo de qué tan grande sea su colección, puede usar el orden aleatorio y luego recoger los primeros elementos según sea necesario. Probablemente desee comparar esto: su colección puede ser lo suficientemente grande y la reproducción aleatoria puede ser lenta, lo que cancela la simplicidad que obtiene de esto. Aquí está la especificación para [shuffle] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#shuffle%28java.util.List%29) –

+0

Un mejor sería utilizar un gen de número 'Random' y ver si la lista elegida ya tiene el número en el índice generado. Luego, ordena usando 'Colecciones' – Jon

Respuesta

9

Pruebe con este método:

public static int[] pickNRandom(int[] array, int n) { 

    List<Integer> list = new ArrayList<Integer>(array.length); 
    for (int i : array) 
     list.add(i); 
    Collections.shuffle(list); 

    int[] answer = new int[n]; 
    for (int i = 0; i < n; i++) 
     answer[i] = list.get(i); 
    Arrays.sort(answer); 

    return answer; 

} 

utilizar de esta manera:

int[] mixColor = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; 
int[] randomPicks = pickNRandom(mixColor, 5); 

El método garantiza que exac Los elementos n se eligen al azar y se devolverán ordenados. También garantiza que ningún elemento será recogido más de una vez, y la matriz resultante no tendrá duplicados, siempre que la matriz de entrada esté libre de duplicados.

El código anterior funciona bien, pero es engorroso tener que cambiar entre int y Integer, y puede ser lento si la matriz de entrada es grande (por ejemplo,> 100.000 elementos). Pruébelo primero y vea si se ajusta a sus necesidades.

+0

la idea es bastante buena y es realmente útil, ¡salud! – nich

+0

Una forma realmente inteligente de obtener el resultado deseado ... buen trabajo –

1
Random gen = new Random(); 
int max = mixCoor.length; // Maximum Random value to generate 

ArrayList<Integer> picked = new ArrayList<Integer>(); // List of picked numbers 

for(int i = 0; i < numToBePicked; i++) { 
    int index = gen.nextInt(max); 
    if(!picked.contains(mixCoor[index]) // If the number isn't already picked 
    picked.add(mixCoor[index]); // Add it to the "picked" list 
} 

Collections.sort(picked); // Sort the picked numbers into ascending order 
-1
Random random new Random(); 
for (int i=0;i<7;i++){ 
int a = mixColor[random.nextInt()%mixColor.length]; 
} 

por supuesto, se puede utilizar una semilla para el azar y obtener más números aleatorios

+2

A esta respuesta le faltan varias cosas que el OP solicitó: no puede repetir los números aleatorios y la clasificación. Vea la respuesta de Jon arriba. –

0

Puede hacer todo lo que desee utilizando la API Java existente:

public static Integer[] pickRandom(Integer[] array, int number) { 
    List<Integer> list = new ArrayList<Integer>(Arrays.asList(array)); 
    Collections.shuffle(list); 
    list = list.subList(0, number); 
    Collections.sort(list); 
    return list.toArray(new Integer[number]); 
} 

Notas: Se necesita la llamada esto con un Integer[], en lugar de int[], por lo que tiene que convertir esto por sí mismo. Además, si bien es "eficiente" en términos de tamaño y complejidad del código, no sería tan eficiente en cuanto a rendimiento (aunque aún podría ser utilizable). Este código sería aún más simple si tuviera un List<Integer> para comenzar.

Cuestiones relacionadas