Witam po drugiej stronie ekranu. Każdy z nas prędzej czy później staje przed koniecznością wygenerowania liczby losowej z zadanego zakresu, czy to liczby rzeczywistej, czy też całkowitej. Po co? Tak naprawdę nie jest to istotne, może to być funkcja obliczająca szansę na wywołanie jakiegoś zdarzenia, uzyskanie losowego mnożnika lub jakąkolwiek inną. Więc zrozumieliśmy, dlaczego jest to potrzebne, a mianowicie do czegokolwiek :) Tak naprawdę istnieje wiele metod uzyskania liczby pseudolosowej, ale podam przykład z klasą
Math
, a mianowicie metodę random()
; Co my mamy? Wywołanie metody Math.random()
zwraca pseudolosową liczbę rzeczywistą ( double
) z zakresu [0;1)
, czyli od 0 do 1 z wyłączeniem 1, co oznacza, że maksymalna liczba w zakresie wynosi 0,99999999999... OK, otrzymaliśmy liczbę pseudolosową, ale co jeśli potrzebujemy własnego asortymentu? Na przykład, czy potrzebujemy liczby pseudolosowej z zakresu [0;100)? Piszemy kod:
public static void main(String... args)
{
final double max = 100.; // Максимальное число для диапазона от 0 до max
final double rnd = rnd(max);
System.out.println("Псевдослучайное вещественное число: " + rnd);
}
/**
* Метод получения псевдослучайного вещественного числа от 0 до max (исключая max);
*/
public static double rnd(final double max)
{
return Math.random() * max;
}
Wyszło nieźle, ale max
(w naszym przypadku) nadal tego nie dostaniemy. Aby otrzymać losową liczbę z zakresu [0;100], musimy dodać max
1 do naszej, a następnie przekonwertować ją na liczbę całkowitą, taką jak int
lub long
(w zależności od używanych zakresów). Piszemy kod:
public static void main(String... args)
{
final int max = 100; // Максимальное число для диапазона от 0 до max
final int rnd = rnd(max);
System.out.println("Псевдослучайное целое число: " + rnd);
}
/**
* Метод получения псевдослучайного целого числа от 0 до max (включая max);
*/
public static int rnd(int max)
{
return (int) (Math.random() * ++max);
}
Uwaga: Jak widać, zmienna max została zwiększona przez formę przedrostka. (Jeśli nie wiesz co to jest, radzę przeczytać mój artykuł ) Świetnie, mamy to, czego chcieliśmy, ale jeśli potrzebujemy zakresu nie od 0, ale np. [10;75] Piszemy kod:
public static void main(String... args)
{
final int min = 10; // Минимальное число для диапазона
final int max = 75; // Максимальное число для диапазона
final int rnd = rnd(min, max);
System.out.println("Псевдослучайное целое число: " + rnd);
}
/**
* Метод получения псевдослучайного целого числа от min до max (включая max);
*/
public static int rnd(int min, int max)
{
max -= min;
return (int) (Math.random() * ++max) + min;
}
Parsowanie kodu z metody rnd
:
Минимальное число диапазона = 10;
Максимальное число диапазона = 75;
max -= min; // Отнимаем от максимального значения минимальное для получения множителя псевдослучайного вещественного числа.
Maksymalna liczba po obliczeniu wynosi 65. Pseudolosowa liczba rzeczywista (na przykład) to 0,18283417347179454 (Uzyskano przez wywołanie Math.random()
). Liczbę maksymalną zwiększano za pomocą formy przedrostkowej przed mnożeniem. Maksymalna liczba wynosi teraz 66. Pomnóż 0,18283417347179454 przez 66. Wynik mnożenia to 12,06705544913844. Wynik mnożenia liczby maksymalnej przez pseudolosową liczbę rzeczywistą konwertujemy na liczbę całkowitą int
. Do przekształconego wyniku dodajemy liczbę minimalną równą 12. Zwracamy wynik: 22 Jak widać z analizy, nawet jeśli pseudolosowa liczba rzeczywista jest równa zeru, to w rezultacie zwrócimy nasze minimum dodania naszej minimalnej liczby do wyniku mnożenia. Mam nadzieję, że było to dla Ciebie przydatne i pouczające. Powodzenia w opanowaniu Javy ;) Jeszcze kilka moich artykułów: Co to jest inkrementacja i dekrementacja Operator dzielenia modulo
GO TO FULL VERSION