2011-12-07 11 views
9

Qualcuno potrebbe dirmi come posso prelevare più numeri casuali diversi da un array in una volta? Ad esempio, c'è un array int lungo. Voglio scegliere 7 numeri da esso. Tutti i numeri non devono essere uguali e ordinarli per aumentare la sequenza.Java: selezionare diversi numeri casuali dall'array in una volta

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[] e mixCoor[] sono lunghi array di int. Posso fare in questo modo, ma se voglio scegliere più numeri questo sarà davvero complicato. E ho bisogno di ordinare anche loro. Qualcuno ha delle buone idee?

+0

Dipende da quanto è grande la tua collezione, puoi usare shuffle e poi raccogliere i primi elementi come richiesto. Probabilmente vuoi fare un punto di riferimento - la tua collezione potrebbe essere abbastanza grande e lo shuffle potrebbe essere lento, il che annulla la semplicità che ne deriva. Ecco le specifiche per [shuffle] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#shuffle%28java.util.List%29) –

+0

Una soluzione migliore il modo sarebbe usare un numero di 'Random' e vedere se l'elenco selezionato ha già il numero nell'indice generato. Quindi ordina usando 'Collezioni' – Jon

risposta

9

Prova con questo metodo:

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; 

} 

usare in questo modo:

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

Il metodo garantisce che exac Gli elementi n vengono scelti casualmente e restituiti ordinati. Garantisce inoltre che nessun elemento verrà selezionato più di una volta e che l'array risultante non avrà duplicati, purché l'array di input non sia duplicato.

Il codice sopra riportato funziona bene, ma è complicato dover passare avanti e indietro tra int e Integer e potrebbe essere lento se l'array di input è grande (ad esempio,> 100.000 elementi). Provalo per primo e verifica se soddisfa le tue esigenze.

+0

l'idea è piuttosto stupida ed è davvero d'aiuto, grazie! – nich

+0

Un modo davvero intelligente per ottenere il risultato desiderato .. buon lavoro –

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]; 
} 

naturalmente, è possibile utilizzare un seme per il casuale e ottenere numeri più randomizzati

+2

In questa risposta mancano diverse cose richieste dall'OP: impossibile ripetere i numeri casuali e l'ordinamento. Vedi la risposta di Jon sopra. –

0

Si può fare tutto quello che vuoi utilizzando l'API Java esistente:

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]); 
} 

Note: è necessario la chiamata questo con un Integer[], piuttosto che int[], quindi dovrete convertire da soli. Inoltre, mentre "efficiente" in termini di dimensioni e complessità del codice, questo non sarebbe efficiente dal punto di vista delle prestazioni (anche se potrebbe essere ancora utilizzabile). Questo codice sarebbe più semplice se avessi un List<Integer> per iniziare.