Konstruktor "egyedivé" tétele?

 ( Gyuszk | 2010. november 20., szombat - 19:01 )

1.) Random hiányosságaim vannak C/C++ terén
2.) Szinte csak Java -ztam az elmúlt 1-1,5 évben

Egyszóval az építő kritikát köszönöm, elfogadom! :)

Tehát a gond: van egy osztály, hozzá egy konstruktor. Például ez:

Rocket::Rocket() {
srand (time(NULL));
x = ( (rand() % SCREEN_WIDTH + 1) );
y = ( (0-( rand() % 500 + 1) ) );
texture = rand() % 8 + 1;
point = 0;
exists = 1;
speed = 1;
};

A példányok pedig egy vektor .resize(valamennyi) műveletével jönnek létre. Sajnos dacára a random inicializálásoknak, minden egyes példány ugyanazokat a member értékeket kapja. Egy új futtatás más, de közös értékeket ad mindegyik objektumnak. Úgy értékelem, hogy a konstruktor csak egyszer fut le, az eredményt pedig bemásolja minden új Rocket példányba, és kész. Vagy valamit nem értek/tudok még. Kérek némi felvilágosítást, köszi!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Srand ugyanarra inicializalja a seedet, ha ugyanabban a milliszekundumban fut le az osszes konstruktor... :^)

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

itten lehet a bibi:

srand (time(NULL));

azaz: ha a kododban a konstruktort 100x hivod meg egymas utan zsinorban, akkor ez szinte biztosan 1 masodpercen belul lefut (gyk mondjuk 0.01 sec alatt). ezalatt a time() mindig ugyanazt az erteket fogja szolgaltatni, azaz a randomgenerator seed-je mindig ugyanaz lesz, azaz a rand() mindig ugyanazt az ertek-sorozatot adja vissza.

magyarul ezt kell csinalni:

main()
{
 fasza_randomgenerator_seed(seed_ami_teljesen_egyedi);
 ...
 x=fasza_randomgenerator();
 ...
}

a seed_ami_teljesen_egyedi az johet pl.:
- /dev/random-bol (ha van eleg entropia, nem blokkol az olvasasa), rosszabbesetben /dev/urandom-bol,
- gettimeofday(): tv.tv_sec e's tv.tv_usec-bol,
- ezeket kombinalva par egyeb josaggal, ami egyedive teszi: getpid(), getppid(), vagy
- hwaddr kinyeres'e (ez azt segiti hogy fizikailag mas gepen futva is mas szamot adjon)
- a fentiek okos kombinacija (128bites seed, ebbol 64 bit timestamp, 32 bit hwaddr-bol, 16-16 bit a getpid()-getppid()-bol)

ja igen, a rand() es egyeb beepitett libc-beli prng-k mindenek csak nem fasza_randomgenerator()-ok. tehat me'g jo seed-ele's eseten se varj csoda't. hanem irj/hasznalj/to"lts le sajatot:
- crypto hash alapu randomgeneratorok
- gf(2^n) alapu kongruenciak
- egyeb block cipher alapu kodolasok.

srand-ból egy elég, pl. main elején. Vagy azt is elhagyhatod, és akkor a default sorozatot kapod.