2011-10-11 11 views
7

qualcuno può dirmi come generare numeri casuali con nessuna ripetizione esempioAndroid - generare numeri casuali con nessuna ripetizione

random (10) dovrebbe (potrebbe) tornare 3,4,2,1,7,6 , 5,8,9,10 con nessuna ripetizione

Grazie

+0

vi aiuterà a: http://stackoverflow.com/questions/4040001/java-creating-random-numbers-with-no-duplicates – Thiru

risposta

25

vorrei suggerire di aggiungere i numeri per un ArrayList<Integer> e quindi utilizzare Collections.shuffle() randomizzare loro ordine. Qualcosa di simile a questo:

ArrayList<Integer> number = new ArrayList<Integer>(); 
for (int i = 1; i <= 10; ++i) number.add(i); 
Collections.shuffle(number); 
+0

è piaciuto! una domanda, se eseguo Collection.Shuffle due o tre volte fornirà un ordine diverso? – Yogesh

+0

Sono abbastanza sicuro che lo farà. Non riesco a trovare una ragione per cui non dovrebbe. Abbastanza facile da controllare, eh? ;) –

4

Fai un elenco di numeri generati, quando il numero appena generato è già in questa lista si effettua un nuovo numero casuale.

Random rng = new Random(); // Ideally just create one instance globally 
List<Integer> generated = new ArrayList<Integer>(); 
for (int i = 0; i < numbersNeeded; i++) 
{ 
    while(true) 
    { 
     Integer next = rng.nextInt(max) + 1; 
     if (!generated.contains(next)) 
     { 
      // Done for this iteration 
      generated.add(next); 
      break; 
     } 
    } 
} 
+0

sfortunatamente questo metodo non scala molto bene –

-2

Se ci sono solo alcuni numeri, a meno di 100, credo di soluzione potrebbe essere quella di creare una matrice booleana e una volta che si ottiene un numero, impostare la posizione della matrice a true. Non penso che ci vorrà molto tempo prima che tutti i numeri compaiano. Spero che sia d'aiuto!

Cheers!

2

I miei due centesimi

public Collection<Integer> getRandomSubset(int max,int count){ 
    if(count > max){ 
     throw new IllegalArgumentException(); 
    } 
    ArrayList<Integer> list = new ArrayList<Integer>(); 
    for(int i = 0 ; i < count ;i++){ 
     list.add(i); 
    }  
    Collections.shuffle(list); 
    return list.subList(0, count); 
} 
+0

Mi piace il miglioramento 'subList()' in questa soluzione - ottimo per distribuire una mano di carte da un mazzo –