std::random device (tsz. std::random devices)
A C++ korábbi verzióiban az általános módszer az volt, hogy a rand()
függvényt használtuk. Ez azonban számos problémával rendelkezik:
A C++11-től kezdve a <random> fejléc bevezetett egy sokkal modernebb és rugalmasabb rendszert, melyben külön szerepet kapott a std::random_device
.
std::random_device
?A std::random_device
egy véletlen számok forrását reprezentáló osztály a C++ szabványos könyvtárában.
Fő célja:
👉 nem determinisztikus (igazi) véletlen számokat generálni, ha a platform támogatja ezt.
#include <random>
std::random_device rd;
rd
egy példány, amelyet használhatunk számok generálására.unsigned int random_number = rd();
rd()
hívás egy új, véletlenszerű számot ad vissza.
A std::random_device
az operációs rendszer vagy a hardver által biztosított véletlen forrást használja. Például:
/dev/urandom
vagy /dev/random
Ha a rendszer nem támogat igazi véletlen forrást, akkor a std::random_device
fallback-ként determinisztikus algoritmust használhat (pseudo-random). Ezt a standard megengedi.
A std::random_device::entropy()
metódussal megtudhatjuk, hogy a forrás mekkora entrópiát ad:
double entropy = rd.entropy();
#include <iostream>
#include <random>
int main() {
std::random_device rd;
std::cout << "Entropy: " << rd.entropy() << std::endl;
for (int i = 0; i < 10; ++i) {
std::cout << rd() << std::endl;
}
return 0;
}
Kimenet (példa):
Entropy: 0.0 23982749 13282387 82398372 ...
A std::random_device
leggyakoribb felhasználása:
👉 seed generálása egy determinisztikus PRNG-hez (pl. std::mt19937
).
Miért?
std::mt19937
(Mersenne Twister) gyors, de determinisztikus.std::random_device
segítségével, akkor minden futtatás más sorozatot ad.Példa:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distrib(1, 100);
for (int i = 0; i < 10; ++i) {
std::cout << distrib(gen) << std::endl;
}
Ebben a példában:
std::mt19937
seed-je a rd()
által generált szám,distrib
segítségével egyenletes eloszlású számokat generálunk.
Ha valódi véletlen számokra van szükség (pl. kulcsgenerálás), std::random_device
az ideális eszköz, feltéve, hogy az implementáció valóban nem determinisztikus forrást használ.
std::random_device
-et?std::mt19937
-hez std::random_device
-tel generált seed-et használni.Ökölszabály:
✅ std::random_device
: seed generálás, ritka hívások
✅ PRNG (std::mt19937
stb.): tömeges véletlen szám generálás
Módszer | Forrás | Minőség | Gyorsaság | Determinisztikus |
---|---|---|---|---|
rand()
|
Implementációfüggő algoritmus | Gyenge | Gyors | Igen |
std::mt19937
|
PRNG | Nagyon jó | Nagyon gyors | Igen |
std::random_device
|
OS / hardver | Nagyon jó | Lassabb | Nem (ha igazi véletlen) |
std::random_device
deterministic fallback-ot adhat (→ entropy() == 0.0
).
std::random_device
std::mt19937
)entropy() > 0.0
std::random_device rd;
std::seed_seq seed{rd(), rd(), rd(), rd(), rd()};
std::mt19937 gen(seed);
Itt több rd()
hívásból magasabb minőségű seed-et készítünk.
std::random_device
egy modern, szabványos eszköz, amely lehetőséget ad valódi véletlen számok generálására.entropy()
értékét.rand()
helyett alkalmazott véletlenszám-generálás minőségét.