std::rand în C++

Generatorul vechi de numere pseudo-aleatorii din C (rand), inițializat cu srand; în cod nou preferă <random>.

Sintaxă
int rand();
void srand(unsigned seed);

Ce face std::rand

std::rand() returnează un număr întreg între 0 și RAND_MAX (cel puțin 32767). std::srand(seed) stabilește punctul de plecare: același seed dă aceeași secvență, iar fără srand programul se comportă ca și cum seed-ul ar fi 1, deci dă aceleași numere la fiecare rulare.

De obicei seed-ul este ora curentă: std::srand(std::time(nullptr)). Calitatea numerelor depinde de implementare și este slabă, iar rand() % n nu dă probabilități perfect egale. În C++ modern folosește std::mt19937 cu std::uniform_int_distribution.

Parametri

Parametru Descriere
seed Pentru srand: valoarea de pornire a secvenței.

Ce returnează

rand: un întreg între 0 și RAND_MAX. srand: nimic.

Exemple

Exemplul 1: Zaruri diferite la fiecare rulare

#include <cstdlib>
#include <ctime>
#include <print>

int main() {
    std::srand(static_cast<unsigned>(std::time(nullptr)));

    int zar1 = std::rand() % 6 + 1;
    int zar2 = std::rand() % 6 + 1;
    std::println("Ai dat: {} și {}", zar1, zar2);
}

Rezultat posibil (diferă la fiecare rulare)

Ai dat: 4 și 6

Exemplul 2: Același seed, aceeași secvență

Ambele secvențe sunt identice pentru că pornesc de la același seed. Numerele concrete depind de biblioteca C (aici macOS); pe Linux sau Windows vor fi altele.

#include <cstdlib>
#include <print>

int main() {
    std::println("RAND_MAX = {}", RAND_MAX);

    for (int runda = 1; runda <= 2; ++runda) {
        std::srand(42);
        std::print("Runda {}:", runda);
        for (int i = 0; i < 5; ++i) {
            std::print(" {}", std::rand() % 100);
        }
        std::println("");
    }
}

Rezultat

RAND_MAX = 2147483647
Runda 1: 94 23 9 43 26
Runda 2: 94 23 9 43 26

Greșeli frecvente

  • Apelezi srand(time(nullptr)) înaintea fiecărui rand(): în aceeași secundă primești același număr. Apelează srand o singură dată, la începutul programului.
  • Uiți de srand și programul dă aceleași „numere aleatorii” la fiecare rulare.
  • Folosești rand() pentru parole sau coduri de securitate: este previzibil. Nici std::mt19937 nu este potrivit pentru criptografie.

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::random_device: Sursă de numere aleatorii nedeterministe, oferită de sistem; folosită de obicei ca seed pentru std::mt19937.