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ăruirand(): în aceeași secundă primești același număr. Apeleazăsrando 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. Nicistd::mt19937nu 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.