Mistä mahtaa johtua, että jos "arvon"
taulu[i]= rand() % 6;
vaikkapa 5 satunnaislukua taulukkoon ja tulostan ne sen jälkeen, niin kerta toisensa jälkeen luvut ovat aina samat? Eikö ohjelman pitäisi arpoa eri luvut joka kerta kun ohjelma suoritetaan?
Jos randia ei ole alustettu funktiolla s_rand(), tulee tuo ongelma. Lue lisää C-oppaista.
srand, ihan ilman alaviivaa.
Aina kun srand-funktiota kutsutaan tietyllä luvulla, seuraava rand-lukusarja on sama. Aitoa satunnaisuutta ei siis ole olemassa. Hyvä (enimmäkseen käytetty) tapa on käyttää jotakin aikaan liittyvää tuohon alustukseen. time-funktio sopii hyvin:
#include <time.h> // Ja main-funktion alkuun: srand((unsigned int)time(0)); // Muistaakseni ensimmäinen rand() palauttaa aina nollan (ainakin minulle), joten otetaan se pois: rand();
Kiitos paljon.
Niin, tietokonehan on täysin deterministinen eli se EI osaa tehdä mitään satunnaista, kuten arpoa satunnaislukuja. Rand()-funktion tuottamat satunnaisluvut generoidaan siemenluvusta jollakin kaavalla, kuten X=(A*X+B)%C, jossa A, B ja C ovat jotain sopivia vakioita. Seuraava satunnaisluku X lasketaan aina edellisestä kyseisellä kaavalla ja ensimmäinen X:n arvo toimii siemenenä. srand() asettaa X:n alkuarvon. Tällaisia satunnaislukuja kutsutaan pseudosatunnaisiksi, koska ne voidaan ennustaa jos niitä tuottava kaava ja siemen tunnetaan.
Voisit siis vaikka rakentaa helposti oman satunnaislukugeneraattorin seuraavasti:
int X=0; void siemen(int s) // vastaa funktiota srand { X=s; } int satunnaisluku(void) // Vastaa funktioita rand() { int A=5987, B=4349, C=7919; X=(A*X+B)%C; return X; }
Markus kirjoitti:
Niin, tietokonehan on täysin deterministinen eli se EI osaa tehdä mitään satunnaista, kuten arpoa satunnaislukuja.
Jaa kyllä Windows tuntuu aika hyvin osaavan arpoa milloin mitäkin.
Linkku kirjoitti:
Markus kirjoitti:
Niin, tietokonehan on täysin deterministinen eli se EI osaa tehdä mitään satunnaista, kuten arpoa satunnaislukuja.
Jaa kyllä Windows tuntuu aika hyvin osaavan arpoa milloin mitäkin.
Windows ei ole tietokone. Windows on käyttöjärjestelmä :p
Ei, kyllä Windowsinkin Bluescreenissä on lähes aina suunnilleen samat luvut :)
No joka tapauksessa, tällainen rivi löytyy VC++:n rand.c-tiedostosta:
return (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
Pistetään vertailun vuoksi javassa mukana oleva 64-bittinen rand-funktio. Hyvin sama idea kuin edellisessä, tällä vain voi määrätä kuinka monta (1-32) satunnaista bittia arvottavassa luvussa on.
int next(int bits) { seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); return (int)(seed >>> (48 - bits)); }
Aihe on jo aika vanha, joten et voi enää vastata siihen.