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

Losowość.

Liczba losowa.

Generator liczb pseudolosowych.

Dokumentacja klasy Random.

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.