Tööleht on valminud Hariduse Infotehnoloogia Sihtasutuse IT Akadeemia programmi toel

Ülesanne 1: generaatori korrektsuse uurimine

Pseudojuhuslike arvude generaatorite koodi kirjutamisel peab teadma ka arvuti hingeelust!

Kõigepealt kontrolli, et Sul on korrektselt töötav generaator LKG eelmisest praktikumist. Selleks võrdle käsu LKG(6,seeme=15,a=17,b=3,m=256) tulemust allpool toodud näitetulemusega:

## [1] 0.0078125 0.1445312 0.4687500 0.9804688 0.6796875 0.5664062

Kui väärtused on samad, siis on töötab generaator vähemalt toodud parameetrite korral õigest. Vaatleme aga nüüd SAS tarkvaras RANUNI käsuga kasutatavat generaatorit, mis vastab juhule \(a=397204094,b=0,m=2^{31}-1\). SAS tarkvara korral on seemne 10 korral selle generaatori tekitatud esimesed 8 väärtust \[ 0.8496257,\ 0.7008872,\ 0.9982431,\ 0.5939865,\ 0.2160258,\ 0.6927735,\ 0.4297917,\ 0.3169172\] Vaata, kas Sinu generaator annab täpselt samad arvud? Kui ei anna, siis katsu aru saada, milles on probleem. Vihje: uuri järgmiste käskude tulemusi:

print(397204094*1000000001,digits = 20)
print(2^53,digits=20)
print(2^53+1,digits=20)

Ülesanne 2: generaatori parandamine

Installeerige pakett gmp (Gnu Multiple Precision arithmetics) ning laadi see käsuga library(gmp). Uuri järgnevaid käske ning muuda nende abil oma generaatorit nii, et see annaks õigeid tulemusi parameetrite a,b,m korral, mis on väiksemad kui \(2^{53}\). Generaatori väljundiks peaks ikka olema vektor \(n\) reaalarvust 0 ja 1 vahel. Kontrolli, kas parandatud generaator annab juhul \(a=397204094,b=0,m=2^{31}-1\) õiged tulemused.

as.bigz(397204094)*1000000001
as.bigz(10001)%%276
as.numeric(as.bigz(10001)%%276)

Ülesanne 3: Testimine (algus)

Testimiseks on vaja teada, kuidas peaksid käituma juhuslikud arvud ehk sõltumatute katsete tulemused. Siis saame võrrelda pseudojuhuslike arvude käitumist juhuslike arvude käitumisega. Kui liiga erinevad, siis loeme generaatori halvaks.

Alustame lihtsa ideega, kus vaatleme mingi fikseeritud sündmuse toimumist juhuslikel katsetel. Fikseerime näiteks sündmuse \(A=\{0,2\leq X\leq 0,5\}\). Kui me sooritame sõltumatuid katseid \(n\) korda ja loeme kokku \(A\) toimumiste arvu \(N_A\), siis on teada, kuidas \(N_A\) peaks käituma. Mis on \(N_A\) jaotus?

Ülesanne 4: Jaotuse kontroll histogrammi abil

Selle asemel, et vaadelda juhusliku suuruse sattumist ühte lõiku, võib vaadelda näiteks omavahel mittelõikuvate intervallide süsteemi, mis katavad kõik võimalused. Kui nüüd lugeda igasse intervalli sattuvate punktide arvud ühe katse põhjal, siis saame histogrammi.

Tulemus peaks välja nägema selline:

Hii-ruut testiga jaotusele vastavuse kontrollimine

Hii-ruut test on oma olemuselt vahend selleks, et kontrollida lõpliku arvu erinevate väärtustega juhusliku suuruse korral katsetulemuste vastamist mingile fikseeritud jaotusele, mis diskreetsel juhul on kirjeldatud paaridena \((v_i,p_i),\ i=1,\ldots,m\), kus \(v_i,\ i=1,\ldots,m\) on võimalikud väärtused ja \(p_i,\ i=1,\ldots,m\) on nende saamise tõenäosused. Näiteks juhul, kui katseks on täringuvise ja tulemuseks märgime silmade arvu, siis täringu aususe kontrollimiseks võime teha \(n\) katset ning seejärel kontrollida, kas kõikide tulemuste tõenäosus võiks olla \(\frac{1}{6}\). R-is tuleb \(\chi^2\) testi rakendamiseks lugeda kokku erinevate väärtuste esinemiste arv (käsk table) ja siis rakendada testi käsuga chisq.test(tabel, p=c(p1,..,pm)), kus tabel on käsu table rakendamisel saadud tulemus. Tõenäosused võib ära jätta, kui need on kõik võrdsed.

Ülesanne 5

Testime lineaarset kongruentset generaatorit parameetritega \(a=697,\ b=67,\ m=1.6777216\times 10^{7}\). Tekita seemnest 11 lähtuvalt 400 pseudojuhuslikku arvu. Korruta need kuuega, liida 1 ja võta täisosa (kasuks tuleb funktsioon floor). Esimesed 6 arvu peaks tulema

## [1] 1 2 6 4 3 1

Kontrolli \(\chi^2\)-testi abil, kas need võiksid olla ausa täringu abil saadud visete tulemuseks. (kontrolliks: testi \(p\) väärtuseks peaks tulema 0.4812). Mis oleks otsuseks juhul \(\alpha=0.5\)? Kui sageli me teeksima sellise \(\alpha\) korral ausa täringu visete põhjal vale otsuse? Mis on testi tulemuse põhjal otsuseks, kui nõuda, et ausa täringu puhul me teeks õige otsuse üheksal juhul kümnest (sama pika katseseeria korral)?


Kui me tahame \(\chi^2\)-testi kasutada selleks, et kontrollida katsetulemuste vastavust mingi konkreetse jaotusega juhusliku suuruse \(X\) sõltumatute katsete korral saadud väärtustele, siis valime mingid \(m\) vastastikku välistavat \(X\)-ga seotud sündmust, mis katavad kõik võimalused, ning võtame iga katse tulemuseks selle sündmuse järjekorranumbri, mis sellel katsel toimus. Näiteks võime valida sündmusteks Näiteks \(A_i=\{c_{i-1}< X\leq c_i\}\), kus \[-\infty = c_{0} < c_{1} < \ldots < c_{m-1} < c_{m} = \infty. \] Sel juhul on sündmuse \(A_i\) tõenäosus arvutatav juhusliku suuruse \(X\) jaotusfunktsiooni abil kujul \(p_i=P(A_i)=F(c_i)-F(c_{i-1})\). Nüüd võime \(\chi^2\)-testi abil kontrollida, kas vaadeldavate sündmuste toimumise sagedus on kooskõlas nende toimumise tõenäosustega.

Ülesanne 6

Tekita käskudega

set.seed(20200918)
x <- rexp(500,rate=0.2)

pseudojuhuslikud arvud, mis peaks vastama eksponentjaotusele \(Exp(\frac{1}{5})\). Kontrolli nende arvude vastavust sellele jaotusele, vaadeldes piirkondadesse \(A_1=(-\infty,1]\), \(A_2=(1,2]\), \(A_3=(2,3]\),\(A_4=(3,4]\), \(\ldots\), \(A_{10}=(9,10]\), \(A_{11}=(10,\infty)\) sattumise vastavust vaadeldava jaotuse poolt määratud tõenäosustele. Milline on otsus, kui olulisuse nivooks valida 0.05?


Lahenduse skeem:

  1. kõigepealt tekita vektor jaotuspunktides, kuhu võiks lisada ka \(-\infty\) ja \(\infty\), millele vastavad väärtused R-is on -Inf ja Inf. Arve ja vektoreid saab kokku ühendada käsuga c()
  2. Leia järgmisena jaotuse \(Exp(0.2)\) jaotusfunktsiooni väärtused toodud punktides. Siin on kasuks teadmine, et jaotusfunktsiooni saamiseks paneme p tähe jaotuse nime ette, nt punif on ühtlase jaotuse jaotusfunktsioon, pnorm on normaaljaotuse jaotusfunktsioon, pexp on eksponentjaotuse jaotusfunktsioon jne. Infot käsu võimalike parameetrite kohta saab kujul ?käsk.
  3. Piirkondadesse sattumise tõenäosused on järjestikuste väärtuste vahed. Jällegi on R-is mugav vahend vektori järjestikuste väärtuste vahede leidmiseks, selleks on käsk diff, mille rakendamisel saame sündmustele vastavate tõenäosuste vektori.
  4. Siinkohal tuleks mõelda, kas vaadeldava vektori pikkus on piisavalt suur, et igasse piirkonda sattumiste oodatav arv oleks vähemalt 5. Seda tingimust saab kontrollida, kui leida tõenäosuste vektori minimaalne väärtus ning korrutada see vektori x pikkusega. Vektori pikkust saab leida length() käsuga ning miinimumi jaoks on min() funktsioon.
  5. Nüüd tuleb leida igale vaatluse korral see sündmus, mis toimus. Vaadeldaval kujul olevate sündmuste korral on selliseks vaatluste “sildistamiseks” mugav käsk cut, millele tuleb anda ette sildistatav vektor ja piirkondi defineerivate punktide vektor.
  6. Rakenda cut käsu tulemusele käsku table, et lugeda kokku igasse osalõiku sattunud punktide arv. Seejäral rakeda Hii-ruut testi

Otsus valitud olulisuse nivool on …

Kodutöö 2

Ülesanne 2.1 (0,5p) Kasuta praktikumi teises ülesandes parandatud LKG funktsiooni selleks, et tekitada SAS tarkvaras kasutatava RANUNI generaatori algoritmiga seemnest 535 lähtuvalt 1000 pseudojuhuslikku \(u_1,u_2,\ldots,u_{1000}\) arvu ning kirjeldada joonisel nende arvude sattumist vahemikesse \([0,0.3),\ [0.3,0.8],[0.8,1)\). Samal joonisel kujutada teoreetilised 0,1 ja 0,9 kvantiilid (mis on iga vahemiku jaoks erinevad). Kommenteeri tulemust - kas see katse tekitab mingeid kahtluseid generaatori korrektsuse osas või mitte.

Ülesanne 2.2 (0.5 punkti) Kasuta hii-ruut testi selleks, et kontrollida, kas pseudojuhuslike arvude \(y_i=\sqrt{u_i}\) (kus \(u_i\) on ülesandes 2.1 tekitatud väärtused) piirkondadesse \((-\infty,0.1]\), \((0.1,0.3],(0.3,0.5],(0.5,0.9],(0.9,\infty)\) sattunud katsetulemuste arv võib vastata jaotusfunktsiooniga \[F_Y(y)=\begin{cases} 0,& y<0,\\ a\,y^2+(1-a) y^4,& 0\leq y\leq 1,\\ 1,& y\geq 1 \end{cases}\] juhuslikule suurusele juhtudel \(a=0.8,\ a=0.9,\ a=1\). Vihje - kui tõenäosuste arvutamine vektorkäskude abil ei tööta, siis võib need arvutada ükshaaval (soovi korral kasutades for tsüklit).