std::random_device în C++

Sursă de numere aleatorii nedeterministe, oferită de sistem; folosită de obicei ca seed pentru std::mt19937.

Sintaxă
std::random_device rd;
unsigned int x = rd();

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_device pentru milioane de numere: este mult mai lent decât std::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>.