Kurs Java Podstawy - rozszerzony

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 przełnymi możliwościami, zapraszam do przeglądnięcia dokumentacji.

Komentarze

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*/);

Ł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 ;)

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 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!