Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Satunnaislukujen luominen

Sivun loppuun

mrkebab [07.03.2005 12:49:33]

#

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?

ville-v [07.03.2005 12:52:47]

#

Jos randia ei ole alustettu funktiolla s_rand(), tulee tuo ongelma. Lue lisää C-oppaista.

Metabolix [07.03.2005 13:22:13]

#

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();

mrkebab [07.03.2005 13:28:47]

#

Kiitos paljon.

Markus [07.03.2005 21:02:01]

#

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;
}

Linkku [07.03.2005 21:22:33]

#

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.

rndprogy [07.03.2005 22:13:49]

#

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

Metabolix [07.03.2005 22:19:44]

#

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);

FooBat [08.03.2005 12:00:23]

#

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));
}

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta