[viesti Survo-keskustelupalstalla (2001-2013)]
Kirjoittaja: | Seppo Mustonen |
---|---|
Sähköposti: | - |
Päiväys: | 3.11.2004 11:01 |
Simo Puntanen ja Antti Liski ovat huomanneet, että käytettäessä tasaisesti välillä (0,1) jakautuneiden pseudosatunnaislukujen luomiseen rnd()-funktiota argumentilla 0, siis esim. rnd(0)=0.48318581445312, saadut luvut eivät ole riittävän satunnaisia. Survon kyselyjärjestelmässä todetaan mm. (RANDOM?): "For serious applications the alternative random number generator rand() is recommended instead of rnd()." eli rnd() varsinkin 0-argumentilla on tarkoitettu vain tilapäisiin kokeiluihin. rnd():n taustalla on kyllä kohtuullisen hyvä sekakongruenssialgoritmi U(n)=214013*U(n-1)+2531011 (mod 2^31) joka oli aikoinaan mukana Microsoftin C-ohjelmakirjastossa ja jonka - Survon eri versioiden yhteensopivuuden takaamiseksi tässäkin suhteessa - olen ottanut mukaan SURVO MM:ään funktiona rnd(). Siis edelleenkin rnd(s), missä s on nollasta poikkeava siemenluku, tuottaa kohtuullisen hyviä satunnaislukuja. Kun s=0 eli käytetään funktiota rnd(0), Survo valitsee siemenluvun koneen sisäisestä kellosta, jolloin joka kerralla saadaan erilaisia satunnaislukuja. Tapa, jolla aikoinaan (vuonna 1985) toteutin rnd(0):n, oli alunperin kelvollinen, koska koneet olivat huomattavasti hitaampia eli peräkkäisten lukujen poiminta-aika oli silloin nykyistä selvästi pitempi eikä Simon ja Antin havaitsema ilmiö päässyt esiin. Olen nyt rukannut rnd(0):aa. Vain ensimmäinen luku katsotaan kellosta ja se määrää seuraavien lukujen siemenluvun s. Olen testannut tätä toimintaa jonkin verran käyttäen RNDTEST-operaatiota ja tulokset näyttävät kelvollisilta. Parannettu rnd(0) tulee mukaan versiosta 2.18 lähtien ja toimii uudella tavalla sekä editoriaalisessa laskennassa että VAR-operaatiossa. Muihin satunnaislukuja käyttäviin Survon ohjelmiin en ole tätä muutosta tehnyt, koska "ammattikäytössä" ei koskaan saisi luottaa rnd(0):aan. Simulointikokeissa (Monte Carlo), joiden perusteella on tarkoitus tehdä pitäviä päätelmiä, on erittäin tärkeätä, että kokeet voidaan toistaa täsmälleen samoilla luvuilla, ts. käytetyt generaattorit (Survossa vaihtohtoisesti rnd, rand ja urand, kts. RAND?:R) ja niiden siemenluvut tulisi raportoida koetulosten yhteydessä. Tätä näkökohtaa olen korostanut jo 1970-luvulla ja toiminut sen mukaisesti (esim. Digressioanalyysi-raportissani vuonna 1976). Jokaisella generaattorilla on omat väistämättömät heikkoutensa, joiden vaikutusta tuloksiin on mahdotonta ennalta arvata. Etenkin silloin, kun mielestään saa simulointikokeen tuloksena jotain yllättävää, on välttämätöntä toistaa koe käyttäen jotain toista perusgeneraattoria. Tällaisessa tarkistuksessa kannattaa esim. Survossa vaihdella generaattoreiden rand, urand ja rnd välillä, sillä ne toimivat eri periaatteilla. Mitään aidosti satunnaista ei ole mahdollista luoda tietokoneella eikä ankarassa mielessä muillakaan keinoin. Olen joskus pyytänyt pitämilläni kursseilla osanottajia antamaan minulle aidosti satunnaisen luvun ja perustelemaan, miksi se on satunnainen; yhtäkään lukua ei ole tarjottu. Aito satunnaisuus joudutaan siis simulointikokeissa korvaamaan deterministisillä algoritmeilla (sekakongruenssi esimerkkinä edellä), jotka kyllin uskottavasti matkivat ideaalista sattumaa. Hyvä, alan nykytilannetta kuvaava mutta varsin tekninen yleiskatsaus satunnaislukuhin on P. L'Ecuyer, "Random Number Generation", chapter 2 of the Handbook of Computational Statistics, J. E. Gentle, W. Haerdle, and Y. Mori, eds., Springer-Verlag, 2004, 35-70. jonka verkkoversio on http://www.iro.umontreal.ca/~lecuyer/myftp/papers/handstat.pdf - Seppo
Vastaukset: |
---|
Survo-keskustelupalstan (2001-2013) viestit arkistoitiin aika ajoin sukrolla, joka automaattisesti rakensi viesteistä (yli 1600 kpl) HTML-muotoisen sivukokonaisuuden. Vuoden 2013 alusta Survo-keskustelua on jatkettu entistäkin aktiivisemmin osoitteessa forum.survo.fi. Tervetuloa mukaan!