Satunnaisluvuista

[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!

Etusivu  |  Keskustelu
Copyright © Survo Systems 2001-2013. All rights reserved.
Updated 2013-06-15.