Generowanie liczb losowych w Javie

Mężczyzna trzymający okulary podczas pisania kodu na laptopie i wielu monitorach.

Sarinya Pinngam / EyeEm / Getty Images





Generowanie serii losowe liczby to jedno z tych typowych zadań, które pojawiają się od czasu do czasu. W Jawa , można to osiągnąć po prostu za pomocą klasy java.util.Random.

Pierwszy krok, jak przy użyciu dowolnego API klasa , jest umieszczenie instrukcji import przed rozpoczęciem klasy programu:



Następnie utwórz obiekt Random:

Obiekt Random zapewnia prosty generator liczb losowych. Metody obiektu dają możliwość losowania liczb. Na przykład metody nextInt() i nextLong() zwrócą liczbę mieszczącą się w zakresie wartości (ujemnych i dodatnich) odpowiednio typu danych int i long:



Zwracane liczby będą losowo wybranymi wartościami int i long:

Wybieranie liczb losowych z określonego zakresu

Zwykle losowe liczby, które mają zostać wygenerowane, muszą należeć do określonego zakresu (np. od 1 do 40 włącznie). W tym celu metoda nextInt() może również przyjmować parametr int. Oznacza górną granicę zakresu liczb. Jednak górna liczba graniczna nie jest uwzględniona jako jedna z liczb, które można wybrać. To może wydawać się mylące, ale metoda nextInt() działa od zera w górę. Na przykład:

wybierze tylko losową liczbę od 0 do 39 włącznie. Aby wybrać z zakresu, który zaczyna się od 1, po prostu dodaj 1 do wyniku metody nextInt(). Na przykład, aby wybrać liczbę od 1 do 40 włącznie, dodaj jedną do wyniku:

Jeśli zakres zaczyna się od większej liczby niż jeden, będziesz musiał:



  • minus numer początkowy od numeru górnego limitu, a następnie dodaj jeden.
  • dodaj numer początkowy do wyniku metody nextInt().

Na przykład, aby wybrać liczbę od 5 do 35 włącznie, górna liczba graniczna będzie wynosić 35-5+1=31 i do wyniku należy dodać 5:

Jak losowa jest klasa losowa?

Należy zaznaczyć, że klasa Random generuje liczby losowe w sposób deterministyczny. Algorytm generujący losowość opiera się na liczbie zwanej ziarnem. Jeśli znany jest numer zalążkowy, to z algorytmu można wyliczyć liczby, które zostaną wygenerowane. Aby to udowodnić, użyję liczb z daty, w której Neil Armstrong pierwszy wszedł na Księżyc jako mój numer nasion (20 lipca 1969):​



Bez względu na to, kto uruchomi ten kod, sekwencja otrzymanych liczb „losowych” będzie wyglądać tak:

Domyślnie numer początkowy używany przez:



jest bieżącym czasem w milisekundach od 1 stycznia 1970. Zwykle da to wystarczająco losowe liczby dla większości celów. Należy jednak pamiętać, że dwa generatory liczb losowych utworzone w ciągu tej samej milisekundy wygenerują te same liczby losowe.

Należy również zachować ostrożność podczas korzystania z klasy Random dla dowolnej aplikacji, która musi mieć bezpieczny generator liczb losowych (np. program hazardowy). Możliwe jest odgadnięcie numeru inicjatora na podstawie czasu działania aplikacji. Ogólnie rzecz biorąc, w przypadku aplikacji, w których liczby losowe są absolutnie krytyczne, najlepiej jest znaleźć alternatywę dla obiektu Random. W większości zastosowań, w których wystarczy pewien element losowy (np. kości do gry planszowej), działa to dobrze.