2012-02-24 19 views
6

Chcę utworzyć 10 liczb losowych z zakresu 0-500. Problem polega jednak na tym, że chcę, żeby te liczby były unikalne. Dla 2 liczb losowych mogę stworzyć coś w następujący sposób:Wygeneruj zestaw unikatowych liczb losowych w Javie

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

Ale jeśli zrobię to za 10, myślę, że podczas gdy to będzie stos. I mówię to, ponieważ próbuję stworzyć ogromny algorytm, który próbuje dokonywać ciągłych ocen i chcę nieustannie brać 10 losowych i unikalnych liczb. Nie wiem, co robić. Wszelkie pomysły i sugestie?

+1

Try google szukając go najpierw http://www.wikihow.com/Generate-N-Different-Random-Numbers –

+1

Ale to straszne miejsce, a odpowiedź nie jest źle. – BCoates

+0

@MichaelT Wątpliwości. Drugi chce * jednej * liczby w zakresie, podczas gdy ten chce * wiele * liczb w zakresie. –

Odpowiedz

3

Zrób LinkedList numerów od 1-500 i losowo jeden z nich za każdym razem użyć numer przy użyciu The Fisher-Yates shuffle.

Zapewni to gwarantowaną wydajność (stały czas) dla każdego wyciągniętego numeru.

17

Wygląda na to, że przechowujesz je w poszczególnych zmiennych. "Normalne" miejsce do przechowywania grup takich pozycji zwykle znajduje się na liście lub tablicy.

W tym przypadku przechowuj je w "ustawionej" strukturze danych. Nie pozwoli na duplikaty.

Set dokumentacja: 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

to jest schludne rozwiązanie, plus jeden – davogotland

-1

Chciałbym użyć tablicy i przechowywać liczby, jak są one generowane w tej tablicy. Wygenerowałbyś nowy losowy, następnie musisz przerobić przez tablicę do liczby, sprawdzając, czy pasuje do wcześniej utworzonego.

+0

To byłoby okropny projekt. Nieokreślone potrzeby procesora. Poprzednie odpowiedzi są znacznie bardziej szczegółowe: utwórz zestaw źródłowy liczb kwalifikowanych, "przetasuj je", a następnie po prostu przetestuj wynikową listę losową. – RichieHH

+0

Dla tego rozwiązania, mam wrażenie, że głównym problemem byłoby pisanie więcej kodu i niestosowanie łatwo dostępnych struktur danych. Ponieważ nie używasz łatwo dostępnej struktury danych, takiej jak zestaw, spędzasz więcej czasu na pisaniu i debugowaniu kodu. W zależności od aplikacji, nie jestem pewien, czy martwię się tak bardzo o potrzeby procesora, biorąc pod uwagę, że OP potrzebuje tylko 10 liczb losowych. Jednak wiele łatwo dostępnych "zestawionych" struktur danych będzie również zaprojektowanych z użyciem czegoś bardziej wydajnego niż algorytm O (n^2), który sugerujesz powyżej. –

4

Kolekcje Java mają metodę przetasowania. Możesz umieścić swoje liczby w tablicy ArrayList, a następnie przetasować jej zawartość. Jeśli ArrayList zawiera n liczb, wywołanie metody shuffle da ci taką samą ArrayList zawierającą n liczb, ale rozmieszczonych losowo.

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] 
Powiązane problemy