Ugrás a tartalomhoz

std::srand

A Wikiszótárból, a nyitott szótárból


Főnév

std::srand (tsz. std::srands)

  1. (informatika)

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.