2012-02-24 19 views
6

Voglio creare 10 numeri casuali nell'intervallo 0-500. Ma il problema è che voglio che quei numeri siano unici. Per i 2 numeri casuali ho potuto creare qualcosa come il seguente:Genera un insieme di numeri casuali univoci in Java

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

Ma se faccio questo per 10, penso che il tempo sarà impilare. E sto dicendo questo perché sto cercando di creare un algoritmo enorme che sta cercando di fare valutazioni continue e voglio continuare a prendere 10 numeri casuali e univoci. Io non so cosa fare. Qualche idea o suggerimento?

+1

provare Google ricerca in primo luogo http://www.wikihow.com/Generate-N-Different-Random-Numbers –

+1

Ma questo è un luogo terribile e la risposta non è sbagliato. – BCoates

+0

@MichaelT Lo dubito. L'altro vuole * un * numero nell'intervallo, mentre questo desidera * più * numeri nell'intervallo. –

risposta

3

Fai un LinkedList dei numeri 1-500 e shuffle uno su di loro ogni volta che si utilizza un numero utilizzando The Fisher-Yates shuffle.

Questo vi darà prestazioni sane (a tempo costante) per ogni numero estratto.

17

Sembra che lo stiate memorizzando in singole variabili. La posizione "normale" per archiviare gruppi di elementi come questo di solito è in una lista o in un array.

In questo caso, memorizzarli in una struttura dati "set". Non permetterà duplicati.

documentazione: 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

questa è una soluzione accurata, più uno – davogotland

-1

Vorrei usare un array e memorizzare i numeri così come sono generati in quell'array. Dovresti generare un nuovo casuale, quindi devi scorrere l'array fino al conteggio dei numeri, controllando se corrisponde a quelli che hai precedentemente creato.

+0

che sarebbe un design orribile. Esigenze CPU indeterminate. Le risposte precedenti sono molto più pertinenti: creare un set sorgente di numeri idonei, "mescolarli" e quindi semplicemente ripetere l'elenco casuale risultante. – RichieHH

+0

Per questa soluzione, ritengo che il problema principale sarebbe scrivere più codice e non utilizzare strutture di dati prontamente disponibili. Poiché non utilizzeresti una struttura di dati facilmente disponibile come un set, impiegherei più tempo a scrivere e a eseguire il debug del codice. A seconda dell'applicazione, non sono sicuro che mi preoccuperei così tanto delle esigenze della CPU considerando che l'OP ha bisogno solo di 10 numeri casuali. Tuttavia, molte delle strutture di dati "set" prontamente disponibili sarebbero anche progettate usando qualcosa di più efficiente dell'algoritmo O (n^2) che suggerisci sopra. –

4

Java Collections ha un metodo shuffle. Puoi mettere i tuoi numeri in un ArrayList e poi mescolare il suo contenuto. Se ArrayList contiene n numeri, chiamando il metodo shuffle, otterresti lo stesso ArrayList che contiene n numeri, ma disposti casualmente.

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] 
Problemi correlati