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());
}
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<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!