Ce face std::random_device
std::random_device cere numere aleatorii sistemului de operare (pe Linux și macOS, din /dev/urandom sau similar). Valorile sunt diferite la fiecare rulare și nu pot fi reproduse.
Este mai lent decât un generator pseudo-aleator, așa că rolul lui obișnuit este să dea seed-ul inițial: std::mt19937 gen(std::random_device{}());. Pe unele platforme vechi (MinGW înainte de GCC 9.2) producea aceeași secvență la fiecare rulare.
Ce returnează
Fiecare apel rd() returnează un unsigned int aleatoriu.
Exemple
Exemplul 1: Numere direct din random_device
#include <print>
#include <random>
int main() {
std::random_device rd;
for (int i = 0; i < 3; ++i) {
std::println("{}", rd());
}
}
Rezultat posibil (diferă la fiecare rulare)
2813740961
904515223
3592188420
Exemplul 2: Seed pentru mt19937
Tiparul obișnuit: random_device o singură dată, pentru seed, apoi generatorul rapid pentru toate numerele.
#include <print>
#include <random>
int main() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> zar(1, 6);
std::print("Zaruri:");
for (int i = 0; i < 5; ++i) {
std::print(" {}", zar(gen));
}
std::println("");
}
Rezultat posibil (diferă la fiecare rulare)
Zaruri: 3 6 1 4 4
Greșeli frecvente
- Folosești
random_devicepentru milioane de numere: este mult mai lent decâtstd::mt19937. - Creezi un
random_deviceși un generator nou la fiecare apel de funcție: costă inutil. Creează generatorul o dată și refolosește-l.
Comenzi înrudite
std::mt19937: Generatorul Mersenne Twister: numere pseudo-aleatorii rapide și de calitate, reproductibile cu un seed fix.std::uniform_int_distribution: Transformă numerele unui generator în întregi aleatorii dintr-un interval [a, b], toate cu aceeași probabilitate.std::shuffle: Amestecă aleatoriu elementele unui interval folosind un generator de numere aleatorii.std::rand: Generatorul vechi de numere pseudo-aleatorii din C (rand), inițializat cu srand; în cod nou preferă <random>.