Losowość jest powszechnie występującym zjawiskiem w naszym życiu codziennym. Elementy losowe od zawsze stanowiła źródło rozrywki dla ludzi czego dowodem jest towarzyszący od wieków hazard. Nie inaczej jest dziś, choć losowość ma znaczenie także w mniej kontrowersyjnych rozrywkach takich jak gry komputerowe oraz coraz bardziej popularne gry planszowe.
Losowość jest zjawiskiem, którego w żaden sposób nie możemy obliczyć, natomiast można ją opisać przy pomocy różnych rozkładów. Możemy też korzystając z pewnych danych poznawczych wywnioskować większe prawdopodobieństwo danego zdarzenia. Przykładem może być zakład sportowy polegający na obserwowaniu zawodnika, który odnosi sukcesy. Istnieje większe prawdopodobieństwo, że to właśnie on wygra dane zawody.
Z pewnością wielokrotnie spotkaliście się z pojęciem liczb pseudolosowych. Ich wartości są w rzeczywistości obliczane przy pomocy stosownego algorytmu. Oznacza to, że w przypadku identycznych danych wejściowych algorytm zwróci ten sam ciąg wartości.
Czemu zatem zdawać się na tak ograniczoną losowość? Otóż komputery nie są spontaniczne i mogą wykonywać jedynie to co zostało zaprogramowane. Poza tym jest to najprostszy sposób na zapewnienie jakiejkolwiek losowości.
Ziarnem dla generatora liczb pseudolosowych jest wartość, która jest przetwarzana przez algorytm w celu uzyskania wartości. Jeżeli wartość ziarna jest użyta dwa razy w celu uzyskania ciągu liczb pseudolosowych, to będą one identyczne.
Implementacją generatora liczb pseudolosowych w Javie jest klasa Random
. Zawiera ona szereg metod, które pozwolą zwrócić żądaną przez nas wartość. Pierwszym krokiem w tym celu jest utworzeniu obiektu typu Random
.
1 |
Random r = new Random(); |
Lub utworzyć obiekt random podając własne ziarno.
1 2 |
long seed = 100000000L; Random r = new Random(seed); |
Należy jednak pamiętać, że gdy ziarno jest stałe, to przy każdym uruchomieniu programu wygenerowana sekwencja liczb, znaków czy też innych wartości będzie identyczna. Aby zmodyfikować ziarno można użyć metody setSeed()
.
1 2 3 |
Random r = new Random(); long seed = 100000000L; r.setSeed(seed); |
Zwróćmy uwagę, że zarówno ustawienie ziarna w konstruktorze jak i przy pomocy metody setSeed()
przyniesie ten sam efekt.
Aby uzyskać konkretne dane skorzystamy z odpowiednich metod w zależności od typu danych.
1 2 3 4 5 6 7 8 9 10 11 12 |
import java.util.Random; public class Test { public static void main(String[] args) { Random r = new Random(); int a = r.nextInt(); boolean b = r.nextBoolean(); float c = r.nextFloat(); System.out.print(a + " " + b + " " + c); } } |
Przykładowym efektem uruchomienia programu może być.
1 |
2069186581 true 0.9077425 |
Uzyskanie wartości pseudolosowej oferuje również klasa Math
i jej metoda random()
. Jej cechą jest to, że zawsze zwraca ona wartość dodatnią z przedziału od 0.0 włącznie do 1.0 (rozłącznie).
1 2 3 4 5 6 |
public class Test { public static void main(String[] args) { double d = Math.random(); System.out.print(d); } } |
Wynikiem uruchomienia powyższego kodu może być.
1 |
0.5704814299275751 |
To zależy od sytuacji. Należy tak dobierać sposób uzyskania losowej wartości, aby w jak najprostszy sposób wygenerować wartość, która będzie użyteczna w naszym programie.
Jeżeli problem dotyczy np. wartości logicznej, to prostsze wydaje się być użycie metody nextBoolean()
. Natomiast nic nie stoi na przeszkodzie, aby napisać własny algorytm przetwarzający dane z metody random()
i zwracające wartość typu boolean.
About the author