Klasa Random - generator pseudolosowy

Czasem zdarza nam się, że potrzebujemy, chociażby do przetestowania aplikacji, pakietu liczb losowych. W takich momentach, z pomocą przychodzi nam klasa Random. Klasa ta, udostępnia nam kilka metod, za pomocą których wygenerujemy sobie dowolnego typu liczby pseudolosowe, z wybranych przez siebie zakresów. Wymienię i opiszę kilka bardziej przydatnych metod.

boolean nextBoolean() - metoda zwraca nam losowo true albo false. Tego chyba nie trzeba bardziej wyjaśniać.

double nextDouble() - metoda zwraca nam losową liczbę z przedziału 0 - 1. Jeżeli chcemy, aby wygenerowane zostały liczby losowe typu double z jakiegokolwiek innego przedziału, musimy zwracany wynik odpowiednio pomnożyć / podzielić. Poniżej przykład. Wykorzystana w nim struktura danych to lista wiązana.

 LinkedList m = new LinkedList();
 Random generator = new Random();

 for(int i=0; i<36; i++) {

    m.add(generator.nextDouble()*10);

 }

float nextFloat() - metoda zachowuje się jak powyżej, z tym że generuje liczby zmiennoprzecinkowe pojedyńczej precyzji.

LinkedList m = new LinkedList();
Random generator = new Random();

for(int i=0; i<36; i++) {

   m.add(generator.nextFloat(50));

}

***int nextInt()***- metoda ta, różni się od powyższych zakresem i typem generowanych liczb. Przy tej konkretnej metodzie, zakresem jest cały zakres Integer ,a generowane liczby są zarówno dodatnie, jak i ujemne.

LinkedList m = new LinkedList();
Random generator = new Random();

for(int i=0; i<36; i++) {

   m.add(generator.nextInt());

}

Kurs Java

int nextInt(int n) - to przeładowanie powyższej metody wprowadza górny (i dolny) ogranicznik. Generuje liczby z zakresu od zera (a więc same dodatnie, w przeciwieństwie do wersji bezparametrycznej) do wartości n, podanej jako parametr.

LinkedList m = new LinkedList();
Random generator = new Random();

for(int i=0; i<36; i++) {

   m.add(generator.nextInt(50));

}

Powyższa implementacja wygeneruje nam liczby całkowite z przedziału 0-49.

Oczywiście to nie jedyne możliwości klasy Random. Może ona wygenerować także losowe bity, czy liczby wg rozkladu Gaussa. Jednakże zainteresowanych pełnymi możliwościami, zapraszam do przeglądnięcia dokumentacji.

Jeżeli chcesz generować trochę bardziej złożone dane takie jak imiona, nazwiska, czy adresy, to rzuć okiem na bibliotekę JavaFaker.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

Anonymous

Wygeneruj od 0 do 49. ;)

Longer

a czemu ma służyć to m.add?

lolo

Dodanie wyniku do listy

Longer

heh, faktycznie durne pytanie zadałem;p dzięki!

#YOLO

Ale o co chodzi z tym kasjerem?

Nicci

jak powinnam tego użyć, jeśli chcę wylosować obiekt z ArrayList? Wszędzie widzę losowanie liczb, a mi zależy na obiekcie.

Gosc

list.get(generator.nextInt(list.size()));

Tomek

Witam mam pytanie a jak np wyglądałby generator który losował by nie jedną liczbę tylko np 5

Dawid

int[] x = new int[5]; for(int i=0; i&lt;5; i++) x[i] = generator.nextInt(/*zakres*/);

Damian

Zastanawiam sie jak mozna ustawic zakres losowanych liczb-np od 5 do 50.Zalezy mi na tym, zeby moc manewrowac swobodnie dolnym zakresem.Z gory dzieki za odpowiedz.

Lolo

Bardzo łatwo. Użyj wyrażenia: generator.nextInt(45)+5

Damian

Super.Dzieki za pomoc.

Łukasz

Co do przykładu z nextFloat() - wkradła się wewnątrz nawiasów liczba "50", która oczywiście znajdować się tam nie powinna ;)

Łukasz Z.

"Oczywiście to nie jedyne możliwości klasy Random. Może ona wygenerować także losowe bity, czy liczby Gaussa. Jednakże zainteresowanych przełnymi możliwościami, zapraszam do przeglądnięcia dokumentacji." W dokumentacji klasy Random nie ma nic na temat liczb Gaussa. Chodzi o rozkład Gaussa (czyli rozkład normalny). Proponuje zmienic "... czy liczby Gaussa" (link do http://pl.wikipedia.org/wiki/Liczby_ca%C5%82kowite_Gaussa) na "czy liczby wg rozkladu Gaussa." (link do http://pl.wikipedia.org/wiki/Rozk%C5%82ad_normalny)

Marcin Kunert

Poprawione, dzięki!