Jaki los nas czeka, czyli coś o klasie Random.
Ile razy wspominamy o zrządzeniach losu jakie nas spotkały, ile rzeczy sobie tym tłumaczymy. Ten wpis będzie własnie o tym jak możemy symulować ten los w Javie. Pomine wtęp teoretyczny odsyłając do odpowiednich stron
Generator liczb pseudolosowych.
Tak więc zacznijmy od klasyka czyli loterii liczbowych jednak rozwiązanie które przedstawie będzie bardziej elastyczne niz klasyczny totto lotek. A żeby tak sie stalo na początek poczynimy niezbędne założenia. I tak:
- chcemy mieć mozliwość określenia przedziału z jakiego liczby będą losowane
- oraz ilość losowanych liczb
- natomiast nie chcemy aby się powtarzały
Spełnieniem powyższych warunków jest ponizsza klasa:
package random.RandomNumbersGenerator;
public class NumbersConditions {
private int origin;
private int bounds;
private int size;
public NumbersConditions(int size , int origin , int bounds) {
this.size = size;
this.origin = origin;
this.bounds = bounds;
}
public int getOrigin() {
return origin;
}
public int getBounds() {
return bounds + 1;
}
public int getSize() {
return size;
}
}
W kolejnej klasie dzieje się magia, jedyna metoda która przyjmuje warunki (NumbersConditions numbersConditions),
generuje wykorzystując lambdę nieskończony strumień liczb dla podanego przedziału
IntStream.generate ( () -> {return (rand.nextInt ( numbersConditions.getOrigin ( ) , numbersConditions.getBounds ( )));}),
eliminuje powtórzenia distinct ( ) ,
pobiera określoną w warunkach liczbę elementów limit ( numbersConditions.getSize ( ) ),
opakowuje strumień boxed ( ),
zwraca jako listę toList ( ) którą następnie drukuje forEach ( System.out::println );
package random.RandomNumbersGenerator;
import java.util.Random;
import java.util.stream.IntStream;
public class Generator {
private final Random rand;
public Generator(Random rand) {
this.rand = rand;
}
public void randomNumbers(NumbersConditions numbersConditions) {
IntStream.generate ( () -> {
return (rand.nextInt ( numbersConditions.getOrigin ( ) , numbersConditions.getBounds ( ) ));
} )
.distinct ( )
.limit ( numbersConditions.getSize ( ) )
.boxed ( )
.toList ( )
.forEach ( System.out::println );
}
}
I ostatecznie klasa z metodą main
package random.RandomNumbersGenerator;
import java.util.Random;
public class Main {
public static void main(String[] args) {
NumbersConditions numbersConditions = new NumbersConditions ( 6 , 1 , 49 );
Random rand = new Random ( );
Generator generate = new Generator ( rand );
generate.randomNumbers ( numbersConditions );
}
}
Aby zobaczyć że kod działa zapraszam do pobrania z repozytorium , folder random.
A teraz pora na omówienie możliwości takiej metody. nie trudno się domyslić ze wszelkie loterie liczbowe są jej pisane , ale czy tylko?
Przykładowo warunki zawarte w obiekcie NumbersConditions numbersConditions = new NumbersConditions ( 1 , 1 , 6 ); będzą odpowiadać pojedyńczemu rzutowi kostką do gry , a idąc dalej NumbersConditions numbersConditions = new NumbersConditions ( 1 , 0 , 1 ); będzie odpowiadać rzutowi monetą.
Podsumowując gdy w grach los się do nas nie uśmiechnie, klasę Random możemy wykorzystać do generowanie losowych wartości na potrzeby testów, symulacji przypadkowych trajektorji róznych obiektów fizycznych i wielu innych systemch które mamy zamiar zaprogramować a mają charakter losowy.
Po więcej przykładów zapraszam do repozytorium.
Leave a Comment