Kihagyás

Kiegészítő anyagok

Figyelmeztetés

A jegyzet ezen részében lévő anyagok nem részei a tananyagnak, azonban valós problémák megoldása során minden bizonnyal hasznosak lehetnek.

Véletlen generátor

Sokszor előfordulhat, hogy egy véletlen értékre (bármilyen) van szükségünk, a már tanultakhoz hasonló módon itt is van lehetőségünk generálni véletlen értéket.

Math.random

A beépített java.lang.Math osztálynak számos hasznos függvénye van, számunkra a random() nevű függvény lesz érdekes. Ez egy statikus függvény, ami egy 0 és 1 közötti (balról zárt, jobbról nyílt intervallumról van szó) lebegőpontos számmal tér vissza.

  • 0 és 1 közötti lebegőpontos szám:
double szam = Math.random();
  • 0 és 1 közötti egész szám:
int randomSzam = (int) Math.round(Math.random());
  • 0 és 1000 közötti egész szám:
int randomSzam0 = (int) (Math.random() * 1000); // jobbrol zart (1000 nem lehet)
int randomSzam1 = (int) Math.round(Math.random()*1000); // jobbrol nyitott (1000 is lehet)
  • 37 és 555 közötti egész szám:
int max = 555;
int min = 37;
int randomSzam2 = (int) ((Math.random() * (max - min)) + min); // jobbrol zart
  • Boolean érték
boolean randomBoolean = Math.random() <= 0.5;

Random objektum

A Math.random() nagyon hasonlít a C-ből ismert rand() függvényre. Azonban nem teljesen illeszkedik az objektumorientált programozás koncepciójába, ami nem feltétlenül probléma, azonban Javaban létezik a véletlen generálásra néhány elegánsabb módszer is, az alábbiakban ezekkel ismerkedünk meg.

A java.util.Random osztály segítségével véletlen értékeket generálhatunk. Az implementáció 48-bites seedet használ, amit egy lineáris kongruencia generátorral módosít (erről bővebben Donald Knuth - The Art of Computer Programming című könyvében olvashatsz).

Ez kriptográfia szempontjából nem éppen biztonságos véletlen generátor. Ha ilyet szeretnénk, akkor célszerű lehet a java.security.SecureRandom osztályt használni, ami a java.util.Random leszármazottja.

Az objektum létrehozása egyszerű, vagy beimportáljuk a java.util.Random csomagot, vagy pedig a teljes elérési útvonalát használjuk a kódban.

import java.util.Random;

public class RandomTest {
    public static void main(String[] args) {
        Random randomGenerator = new Random();
        Random secureRandomGenerator = new java.security.SecureRandom();
    }
}
Az alábbiakban pedig bemutatjuk az egyes véletlen értékek generálásának módját. Ahol intervallum-határt adunk meg paraméterként, ott alapértelmezés szerint balról zárt, jobbról nyílt intervallumról van szó, ahogy az előzőekben is.

  • 0 és 1 közötti lebegőpontos szám:
double szam = randomGenerator.nextDouble();
  • 0 és 1 közötti egész szám:
int randomSzam = randomGenerator.nextInt(2);
  • 0 és 1000 közötti egész szám:
int randomSzam0 = randomGenerator.nextInt(1000);
  • 37 és 555 közötti egész szám:
int max = 555;
int min = 37;
int randomSzam2 = r.nextInt(max - min) + min;
  • Boolean érték
boolean randomBoolean = randomGenerator.nextBoolean();

Java 8+ streamek

Java 8 vagy újabb verzió esetében használhatjuk a Random típusú objektumainkon létező olyan metódusokat is, amelyek adott típusú streamekkel térnek vissza.

  • randomGenerator.ints();
  • randomGenerator.longs();
  • randomGenerator.doubles();

A bemutatott kód megértéséhez szükséges a metódus referenciák, lambdák ismerete is.

import java.util.Random;
import java.util.stream.IntStream;

public class RandomTest {
    public static void main(String[] args) {
        Random randomGenerator = new Random();

        IntStream vegtelenIntStream = randomGenerator.ints();
        IntStream adottMeretuIntStream = randomGenerator.ints(10); // 10 darab intet kerunk
        IntStream adottMeretuIntStreamKorlatozasokkal = randomGenerator.ints(10, 2, 200); // 2-200 kozott 10 darab veletlen szam

        adottMeretuIntStreamKorlatozasokkal.forEach(System.out::println);
    }
}

Utolsó frissítés: 2022-03-16 08:55:57