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:
- 0 és 1 közötti egész szám:
- 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
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();
}
}
- 0 és 1 közötti lebegőpontos szám:
- 0 és 1 közötti egész szám:
- 0 és 1000 közötti egész szám:
- 37 és 555 közötti egész szám:
- Boolean érték
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);
}
}