2011-10-11 20 views
7

może ktoś mi powiedzieć jak do generowania liczb losowych bez powtarzania przykładandroid - generowanie liczb losowych bez powtarzania

random (10) powinien (może) powrót 3,4,2,1,7,6 , 5,8,9,10 bez powtarzania

Dzięki

+0

to pomoże: http://stackoverflow.com/questions/4040001/java-creating-random-numbers-with-no-duplicates – Thiru

Odpowiedz

25

proponuję dodanie numerów do ArrayList<Integer> a następnie użyć Collections.shuffle() do losowo ich kolejność. Coś takiego:

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

podobało! pytanie, czy wykonuję Collection.Shuffle dwa razy czy trzy razy, czy zapewni inną kolejność? – Yogesh

+0

Jestem prawie pewien, że tak będzie. Nie mogę znaleźć powodu, dla którego nie powinien. Łatwo to sprawdzić, co? ;) –

4

Zrób listę wygenerowanych liczb, kiedy twój nowo wygenerowany numer jest już na tej liście, tworzysz nową losową liczbę.

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

Niestety ta metoda nie jest zbyt dobrze skalowalna –

-2

Jeśli istnieją tylko kilka numerów, mniej niż 100, myślę, że rozwiązaniem mogłoby być stworzenie logiczną tablicę i gdy pojawi się szereg ustaw pozycję tablicy true. Nie wydaje mi się, żeby pojawiły się wszystkie liczby. Mam nadzieję, że to pomoże!

Pozdrawiam!

2

Moje dwa centy

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

Podoba mi się ulepszenie 'subList()' w tym rozwiązaniu - idealne do rozdawania kart z talii –

Powiązane problemy