[ RMAN @ 10.10.2011. 20:12 ] @
Nije mi jasno kako radi funkcija rand u c-u. Odnosno, ja dobijam random vrednosti, ali svaki put kad pokrenem program dobijem iste vrednosti.

Radim igricu snake, i svaki put mi je hrana na istom mestu

Na primer dobijem koordinate hrane (1,1) (10,15) (22,26). Kada ponovo pokrenem program dobijam iste koordinate.

U cemu je fora?
[ Mihajlo Cvetanović @ 10.10.2011. 21:24 ] @
Na početku rada programa izvrši sledeći kod:

Code (c):
srand(time(NULL));
rand();
rand();


Prva linija postavlja takozvani seed na vrednost trenutnog vremena, što će biti različito svaki put kad se izvršava program. Druge dve linije služe da se slučajni brojevi bolje promešaju. Možda ti poslednje dve linije ne trebaju, ali prva ti sigurno treba.
[ RMAN @ 11.10.2011. 09:53 ] @
To je to

Hvala!

Nego, kako radi rand funkcija? Na osnovu vremena?
[ Mihajlo Cvetanović @ 11.10.2011. 10:26 ] @
Funkcija čuva interno neki broj, i taj broj se menja svaki put kad se pozove funkcija. Povratna vrednost funkcije je izvedena iz tog broja koji se menja. Taj broj se postavlja sa ovom funkcijom srand. Ako se ne postavi onda se računa kao da je postavljen na neku uvek istu vrednost (mislim da je 1).

Evo implementacija funkcija rand i srand u Visual Studiu 2008:

Code (c):
int rand (void)
{
        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff );
}

void srand (unsigned int seed)
{
        _getptd()->_holdrand = (unsigned long)seed;
}
 


Kao što vidiš slučajni brojevi dobijeni funkcijom rand nisu zaista slučajni. Čitav niz slučajnih brojeva definisan je početnim brojem. Pošto su brojevi samo naizgled slučajni, ali nisu zaista, zovu se pseudo-slučajni brojevi.
[ djoka_l @ 11.10.2011. 10:49 ] @
Inače, ovaj generator slučajnih brojeva se zove linearni kongruentni generator.
Neprevaziđene knjgie Donalda Knutha The Art of Computer Programming daju za ovaj algoritam (i druge) način kako izabrati brojeve kojima se množi i sabira pseudoslučajan broj, da bi se dobila što bolja uniformnost.