std::srand
Főnév
std::srand (tsz. std::srands)
srand() függvény C++ nyelven
A srand() (seed random) függvény a C++ régebbi véletlenszám-generálási módszereiben használt függvény, amely a rand() függvény véletlenszám-generátorának inicializálására szolgál. A srand() segítségével beállíthatunk egy kezdőértéket (seed), amely meghatározza a generált véletlenszámok sorozatát.
srand() és rand() használata
Alapértelmezés szerint a rand() mindig ugyanazt a számsorozatot adja vissza, hacsak nem változtatjuk meg a seed-et a srand() segítségével.
Egyszerű példa srand() és rand() használatára:
#include <iostream>
#include <cstdlib> // rand() és srand() miatt
#include <ctime> // time() miatt
int main() {
std::srand(42); // Fix seed: mindig ugyanazokat az értékeket adja
for (int i = 0; i < 5; ++i) {
std::cout << std::rand() % 100 << std::endl; // 0 és 99 közötti véletlenszámok
}
return 0;
}
Kimenet mindig ugyanaz lesz:
83 86 77 15 93
Mivel a seed-et mindig 42-re állítjuk, a generált számok minden futtatáskor ugyanazok lesznek.
Dinamikus seed generálás az aktuális idő alapján
Ha azt szeretnénk, hogy a számok minden programfutásnál eltérőek legyenek, használhatjuk a time(0) függvényt a srand() paramétereként.
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
std::srand(std::time(0)); // Az aktuális idő alapján állítjuk be a seed-et
for (int i = 0; i < 5; ++i) {
std::cout << std::rand() % 100 << std::endl;
}
return 0;
}
Minden futtatásnál eltérő számokat kapunk.
Miért fontos a srand() használata?
- Fix seed (pl.
srand(42)) esetén a véletlenszám-generátor mindig ugyanazokat az értékeket adja vissza. Ez hasznos lehet például teszteléshez. - Változó seed (
srand(time(0))) esetén minden programfutásnál más-más véletlenszámokat kapunk, ami valósabb véletlenszerűséget biztosít.
srand() hátrányai és modernebb alternatívák
A rand() és srand() módszerek elavultak, mert: - Nem garantálják az egyenletes eloszlást. - A RAND_MAX értéke implementációfüggő (általában 32767). - Nem támogatnak különböző eloszlásokat, például normális eloszlást.
A modern C++11 és újabb verziók a <random> könyvtárat ajánlják:
#include <iostream>
#include <random>
int main() {
std::random_device rd;
std::mt19937 gen(rd()); // Mersenne Twister PRNG
std::uniform_int_distribution<int> distrib(1, 100);
for (int i = 0; i < 5; ++i) {
std::cout << distrib(gen) << std::endl;
}
return 0;
}
Ez a módszer jobb véletlenszámokat biztosít, mint a rand() + srand() kombináció.
Összegzés
| Módszer | Előnyök | Hátrányok |
|---|---|---|
rand() és srand() |
Egyszerű, gyors | Kiszámítható, nem elég véletlenszerű |
srand(time(0)) |
Minden futtatásnál eltérő számokat ad | Nem garantál tökéletes eloszlást |
<random> könyvtár (mt19937, random_device) |
Nagyobb pontosság, több eloszlás támogatása | Bonyolultabb használat |
Ha gyors és egyszerű megoldás kell, srand(time(0)) megfelelő lehet. Ha viszont valóban jó minőségű véletlenszámokat szeretnénk, érdemes áttérni a <random> könyvtárra.
- std::srand - Szótár.net (en-hu)
- std::srand - Sztaki (en-hu)
- std::srand - Merriam–Webster
- std::srand - Cambridge
- std::srand - WordNet
- std::srand - Яндекс (en-ru)
- std::srand - Google (en-hu)
- std::srand - Wikidata
- std::srand - Wikipédia (angol)