26
Domaći zadatak broj 1 iz predmeta Performanse računarskih sistema student: Milanović Nikola broj indeksa: 101/95 1) Generisanje pseudoslučajnih brojeva Uvod pseudoslučajni brojevi funkcije raspodele i gustine verovatnoće matematičko očekivanje i varijansa diskretne slučajne promenljive problemi pri projektovanju primena Objasnimo najpre naslov prvog dela domaćeg zadatka. Naime, zašto generatori pseudoslučajnih, a ne slučajnih brojeva? Očigledan razlog je to što ćemo za njihovo generisanje koristiti razne algoritme. Ako smo algoritam definisali kao niz koraka koji nas dovodi do rešenja nekog problema, tada prateći korake algoritma možemo “predvideti” na koji način će se generisati slučajni brojevi, pa oni tada prestaju da budu slučajni. Manje očigledan razlog je konačni kapacitet memorije, tj. memorijskih reči i registara. Kao što ćemo kasnije videti, osnova za generisanje slučajnih brojeva je linearni kongruentni generator, koji radi na sledećem principu: u i+1 =(au i +c) mod n, i = 0,1,2… gde je u i+1 sledeća vrednost u nizu slučajnih brojeva, u i prethodno generisana vrednost, dok su a, c i n koeficijenti. Očigledno je da će se zbog konačne vrednosti koeficijenta n sekvenca slučajnih brojeva pre ili kasnije ponoviti. Iz tog razloga je korektnije ove brojeve zvati pseudoslučajni. U daljem tekstu će se, međutim, oni skoro uvek zvati slučajni kako bi se tekst lakše čitao, kao i iz razloga velike zastupljenosti ovog termina. Šta predstavlja cilj generisanja pseudoslučajnih brojeva? Posmatrajmo sliku: generator slučajnih brojeva ulaz (početni uslovi) sekvenca slučajnih brojeva F(x) Na ulazu u generator slučajnih brojeva se nalazi pobuda, koja u većini slučajeva predstavlja početnu vrednost ili skup koeficijenata koje generator koristi. Njih može zadati korisnik, a moguće je realizovati i generator koji sam određuje koeficijente, tj. početne uslove. Generator vrši transformaciju početnih uslova i na osnovu toga na izlazu generiše niz slučajnih brojeva r 1 , r 2 , r 3 …, r n . Problem generisanja slučajnih brojeva se tada svodi na dobijanje niza brojeva koji slede unapred zadatu funkciju 1

IR4PRS Generisanje Pseudoslucajnih Brojeva

Embed Size (px)

Citation preview

Page 1: IR4PRS Generisanje Pseudoslucajnih Brojeva

Domaći zadatak broj 1 iz predmeta Performanse računarskih sistemastudent: Milanović Nikolabroj indeksa: 101/95

1) Generisanje pseudoslučajnih brojeva

Uvod• pseudoslučajni brojevi• funkcije raspodele i gustine verovatnoće• matematičko očekivanje i varijansa• diskretne slučajne promenljive• problemi pri projektovanju• primena

Objasnimo najpre naslov prvog dela domaćeg zadatka. Naime, zašto generatori pseudoslučajnih, a ne slučajnih brojeva? Očigledan razlog je to što ćemo za njihovo generisanje koristiti razne algoritme. Ako smo algoritam definisali kao niz koraka koji nas dovodi do rešenja nekog problema, tada prateći korake algoritma možemo “predvideti” na koji način će se generisati slučajni brojevi, pa oni tada prestaju da budu slučajni. Manje očigledan razlog je konačni kapacitet memorije, tj. memorijskih reči i registara. Kao što ćemo kasnije videti, osnova za generisanje slučajnih brojeva je linearni kongruentni generator, koji radi na sledećem principu:

ui+1=(a⋅ui+c) mod n, i = 0,1,2…gde je ui+1 sledeća vrednost u nizu slučajnih brojeva, ui prethodno generisana vrednost, dok su a, c i n koeficijenti. Očigledno je da će se zbog konačne vrednosti koeficijenta n sekvenca slučajnih brojeva pre ili kasnije ponoviti. Iz tog razloga je korektnije ove brojeve zvati pseudoslučajni. U daljem tekstu će se, međutim, oni skoro uvek zvati slučajni kako bi se tekst lakše čitao, kao i iz razloga velike zastupljenosti ovog termina.

Šta predstavlja cilj generisanja pseudoslučajnih brojeva? Posmatrajmo sliku:

generatorslučajnihbrojeva

ulaz(početniuslovi)

sekvencaslučajnihbrojeva

F(x)

Na ulazu u generator slučajnih brojeva se nalazi pobuda, koja u većini slučajeva predstavlja početnu vrednost ili skup koeficijenata koje generator koristi. Njih može zadati korisnik, a moguće je realizovati i generator koji sam određuje koeficijente, tj. početne uslove. Generator vrši transformaciju početnih uslova i na osnovu toga na izlazu generiše niz slučajnih brojeva r1, r2, r3…, rn. Problem generisanja slučajnih brojeva se tada svodi na dobijanje niza brojeva koji slede unapred zadatu funkciju

1

Page 2: IR4PRS Generisanje Pseudoslucajnih Brojeva

raspodele verovatnoće F(x). Funkcija raspodele verovatnoće slučajne promenljive r se definiše na sledeći način:

Fr(x) = P [r ≤ x ]Dakle, vrednost funkcije raspodele slučajne promenljive r u nekoj tački x predstavlja verovatnoću da će vrednost slučajne promenljive r biti manja ili jednaka vrednosti x. Definiše se i gustina raspodele verovatnoće kao:

fr x( )ddx

Fr x( )

Sada lako možemo naći verovatnoću da se slučajna promenljiva r nalazi između vrednosti a i b:

P[ a ≤ r ≤ b ] = P[r ≤ b] – P[r ≤ a] = F(b) – F(a) Na isti način sledi i:

P a r b( )a

bxfr x( ) d

Srednja vrednost ili matematičko očekivanje slučajne promenljive r na intervalu (rmin, rmax) se definiše kao:

E r( )rmin

rmax

xxf x( ) d

Varijansa slučajne promenljive r se definiše kao:

σ2r = Var( r ) = E[(r – E(r))2] = E(r2) – E(r)2

σ2

rmin

rmax

xx2 f x( ) d E r( )2

Standardna devijacija slučajne promenljive r je σr.

Posmatrajmo sada diskretnu slučajnu promenljivu r koja može da uzme samo vrednosti r ∈ (x1, x2, x3…, xn). Svakoj vrednosti slučajne promenljive se dodeljuje verovatnoća pojavljivanja, kao u sledećoj tabeli:

x x1 x2 … xn

Pi 0.3 0.2 … 0.05

Sada je f(xi) = P [r = xi], pa se srednje matematičko očekivanje definiše kao:

E r( )

1

n

i

xi f xi

=Iz ovog primera je jasno zašto je matematičko očekivanje u stvari srednja vrednost slučajne promenljive. Na sličan način se definiše i varijansa:

2

Page 3: IR4PRS Generisanje Pseudoslucajnih Brojeva

σ2

1

n

i

xi E r( ) 2 f xi

=Pri projektovanju generatora slučajnih brojeva moramo obratiti pažnju i na sledeće:• period ponavljanja sekvence ne sme biti suviše mali• generator mora da zadovolji testove• generisanje mora da bude brzoGeneratori slučajnih brojeva su našli primenu u velikom broju tehničkih disciplina. Koriste se u Monte Carlo simulacijama, u telekomunikacijama (prenos podataka i njihova zaštita, kodiranje, kriptografija), pri simulacijama procesa u nuklearnoj fizici itd.

Neke važnije funkcije raspodele• uniformna raspodela• eksponencijalna raspodela• normalna i standardna normalna raspodela• centralna granična teorema

Prvo ćemo posmatrati uniformnu raspodelu, koja u ovom razmatranju ima najveći značaj, pošto ćemo korišćenjem generatora slučajnih brojeva sa uniformnom raspodelom biti u stanju da realizujemo generator sa proizvoljnom raspodelom.

Neka je slučajna promenljiva u definisana na intervalu [a,b]. Tada je njena gustina raspodele za x ∈ (a,b):

fu x( ) 1

b aFunkcija raspodele je za x ∈ (a,b):

F x( )x ab a

Za x ≥ b, F(x) = 1, a za x < a, F(x) = 0.Veći značaj ima standardna uniformna raspodela koja je prikazana na slici:

1

1

x

F(x)

3

Page 4: IR4PRS Generisanje Pseudoslucajnih Brojeva

U njoj je a=0 i b=1. Na taj način vrednost slučajne promenljive u ograničavamo na interval (0,1), a funkcija raspodele i gustina raspodele su u intervalu (a,b):

f(x) = 1, F(x) = x

Srednja vrednost i varijansa su:

E u( )a b

2

Varu()ba()2

12Pored uniformne raspodele, često se upotrebljava i eksponencijalna raspodela. Neka je slučajna promenljiva u definisana na intervalu [0 , ∞ ]. Njena gustina raspodele je:

fu(x) = λexp(-λx) za x > 0 i fu(x) = 0 za x ≤ 0.vrednost λ > 0 se naziva parametar raspodele

Funkcija raspodele se dobija integracijom:

Fu(x) = 1 – exp(- λx), za x > 0

Matematičko očekivanje i varijansa su:

E u( ) 1

λ

Var u( ) 1

λ2

Normalna raspodela se definiše za slučajnu promenljivu u, - ∞ < u < + ∞. Gustina raspodele slučajne promenljive u je:

f x( )exp

12

xµσ

2

σ2πdok je funkcija raspodele:

F x( )

x

texp

12

tµσ

2

σ2πd

Ako uvedemo smenu y = (t - µ)/σ, dobija se:

F x( )Φxµσ

gde je Φ(x) tabelirana funkcija, analitički zadata sa:

4

Page 5: IR4PRS Generisanje Pseudoslucajnih Brojeva

F x( )Φxµσ

Φx( )

x

texp

t2

2

2πd

Matematičko očekivanje i varijansa su:E(u) = µ

Var(u) = σ2

Standardna normalna raspodela se dobija za µ = 0 i σ = 1.

Zašto je normalna raspodela toliko važna? Odgovor na to daje centralna granična teorema. Ona predstavlja vrlo važan deo teorije verovatnoće, a mi ćemo je kasnije iskoristiti za projektovanje generatora slučajnih brojeva sa normalnom raspodelom.

1) Posmatrajmo n nezavisnih slučajnih promenljivih r1, r2, … rn sa jednakom raspodelom. Neka su njihova matematička očekivanja µ, a standardne devijacije σ. Formirajmo slučajnu promenljivu Sn = r1 + r2 + … + rn. Tada za svako x i y važi:

∞nP x

Sn nµ

σnyΦy( )Φx( )lim

Pošto je E(Sn) = nµ i Var(Sn) = nσ2, očigledno je da se promenljiva Sn ponaša kao promenljiva sa normalnom raspodelom.

2) Posmatrajmo n nezavisnih slučajnih promenljivih r1, r2, … rn sa različitom raspodelom i matematičkim očekivanjima i standardnim devijacijama µk i σk. Formirajmo ponovo slučajnu promenljivu Sn = r1 + r2 + … + rn. Tada za svako x i y važi:

∞nP x

Sn E Sn

var Sn

yΦy( )Φx( )lim

U ovom slučaju je:

E Sn

1

n

k

µk=

Var Sn

1

n

k

σ2( )k

=

5

Page 6: IR4PRS Generisanje Pseudoslucajnih Brojeva

Generisanje slučajnih brojeva sa uniformnom raspodelom

• linearni kongruentni generator• multiplikativni generator• mešoviti generator• izbor koeficijenata• Knuth-ovi uslovi• M generator

Posle matematičkog uvoda, u stanju smo da počnemo razmatranje o konkretnim realizacijama generatora slučajnih brojeva. Prvo ćemo razmotriti generisanje slučajnih brojeva sa uniformnom raspodelom, jer ćemo u sledećem poglavlju pokazati da uz pomoć takvog generatora možemo realizovati generator sa proizvoljnom raspodelom. Linearni kongruentni generator (u daljem tekstu LKG) na izlazu generiše sekvencu slučajnih brojeva u0, u1, u2,…, un-1. Dužina sekvence je n. Generisanje sekvence se vrši multiplikativnim generatorom, koji radi na sledeći način:

ui+1 = (aui) mod n, i = 0,1,…Dakle, sledeća vrednost u sekvenci ui+1 se generiše na osnovu prethodne vrednosti ui i vrednosti koeficijenata a i n. Međutim, češće se koristi mešoviti generator:

ui+1 = (aui + c) mod n, i = 0,1,…Kao što vidimo, realizacija mešovitog generatora je veoma jednostavna, pod uslovom da znamo vrednosti u0, a, c i n. Pošto početna vrednost u0 nije kritična, glavni problem u projektovanju LKG se svodi na izbor koeficijenata. Pokazuje se da oni moraju da zadovolje sledeće zahteve:

1) n mora biti oblika bp, za binarne generatore b=2, a za decimalne b=102) c mora biti prost broj u odnosu na n3) a – 1 mora biti multipl svakog prostog činioca n4) a – 1 mora biti multipl od 4, ako je n multipl od 4

Na ovaj način možemo generisati maksimalno n brojeva. Pri izboru vrednosti koeficijenata se mora voditi računa da prilikom množenja ne dođe do prekoračenja. Moguć izbor je n = 32764, a = n+1, c = 13.

Problemom izbora koeficijenata za LKG bavio se i čuveni matematičar Donald Knuth. On je formulisao uslove koje moraju da zadovolje koeficijenti n, a i c kako bi se dobio LKG maksimalne dužine. To su Knuth-ovi uslovi:

1) n treba da bude veliki broj oblika 2p ili 10p

2) a treba da ima nepravilnu strukturu i da zadovoljava:n

100a<n n<

ilin a<n n<

Zatim se za a predlažu sledeće vrednosti:a = 8k + 5 (decimalni generator)a = 200k + 21 (binarni generator)

6

Page 7: IR4PRS Generisanje Pseudoslucajnih Brojeva

3) c = 2k +1 (binarni generator)c = 2k + 1 i nije deljiv sa 5 (decimalni generator)Knuth predlaže vrednost:

c 0.53

6n 0.211325 n

Uzimajući u obzir prirodu koeficijenata, najlakše je njihovo generisanje (po bilo kom kriterijumu) prepustiti samom generatoru. Zato je u nastavku priložen program koji računa vrednosti koeficijenata n, a i c po Knuth-ovim uslovima i zatim, koristeći dobijene vrednosti, generiše slučajne brojeve uz pomoć mešovitog generatora.

#include <math.h>#include <stdio.h>

void main (void) {

int i,b, p; double n, a1, a2, ad, ag; long a, c, u0; printf ("\nBinarni (2) ili decimalni (10) generator? "); scanf ("%d", &b);

if (b != 2) b = 10; printf ("Broj %s cifara? ", b==2 ? "binarnih" : "decimalnih"); scanf ("%d", &p); n = pow (b, p); a1 = n / 100; a2 = sqrt (n); ad = a1>a2 ? a1 : a2; ag = n - a2;

printf ("Predlog za faktor \'a\'? "); scanf ("%ld", &a); if (a<ad || a>ag) a = (long) sqrt (ad * ag); while (b==2 && a%8!=5 || b==10 && a%200!=21) a--; for (c=0.5*(1-1/sqrt(3))*n; c%2==0 || b==10 && c%5==0; c++); printf ("n = %d ^ %d = %.0f\n", b, p, n); printf ("%.0f < a < %.0f\n", ad, ag); printf ("Koeficijenti su: a= %ld, c= %ld, n= %f\n",a,c,n); printf ("u = (%ld * u + %ld) %% %.0f\n", a, c, n); printf("Unesite pocetnu vrednost u0: "); scanf("%ld", &u0); printf("%ld\n",u0); for (i=0;i<n;i++) { printf("%ld\t",u0); u0=(u0*a+c) % (long)n; }}

Ukratko ćemo objasniti način rada. Moguće je računanje koeficijenata za binarni ili decimalni generator, pa se korisniku zato na početku nudi mogućnost da izabere željeni generator. Zatim se bira broj cifara. U zavisnosti od izbora se određuje vrednost koeficijenta n (2broj cifara ili 10broj cifara). Kada znamo vrednost koeficijenta n, određujemo granice u kojima se može kretati koeficijent a (ad – donja granica i ag – gornja granica). Zatim pitamo korisnika da predloži vrednost za a. Ako se uneta vrednost nalazi van opsega, početna vrednost za a će biti geometrijska sredina gornje i donje granice. Zatim smanjujemo vrednost a sve dok ne stignemo do prve vrednosti

7

Page 8: IR4PRS Generisanje Pseudoslucajnih Brojeva

koja zadovoljava Knuth-ove uslove. Za početnu vrednost c uzimamo 0.211325n, a zatim povećavamo c sve dok ne dođemo do broja koji zadovoljava Knuth-ove uslove. Na kraju program ispisuje vrednosti koeficijenata. Radi kompletnosti, na kraju je dodata i for petlja u kojoj se na osnovu unete početne vrednosti u0, korišćenjem dobijenih koeficijenata računaju vrednosti nekoliko slučajnih brojeva. U nastavku se nalaze vrednosti dobijene korišćenjem decimalnog generatora sa koeficijentima a=21, c=211 i n = 1000 (trocifreni generator). Početna vrednost je bila 345.

Koeficijenti su: a= 21, c= 211, m= 1000.000000u = (21 * u + 211) % 1000Unesite pocetnu vrednost u0: 345345 456 787 738 709 100 311 742 793 864 355 666

197 348 519 110 521 152 403 674 365 876 607958 329 120 731 562 13 484 375 86 17 568139 130 941 972 623 294 385 296 427 178 949140 151 382 233 104 395 506 837 788 759 150361 792 843 914 405 716 247 398 569 160 571202 453 724 415 926 657 8 379 170 781 61263 534 425 136 67 618 189 180 991 22 673344 435 346 477 228 999 190 201 432 283 154445 556 887 838 809 200 411 842 893 964 455766 297 448 619 210 621 252 503 774 465 976707 58 429 220 831 662 113 584 475 186 117668 239 230 41 72 723 394 485 396 527 27849 240 251 482 333 204 495 606 937 888 859250 461 892 943 14 505 816 347 498 669 260671 302 553 824 515 26 757 108 479 270 881712 163 634 525 236 167 718 289 280 91 122773 444 535 446 577 328 99 290 301 532 383254 545 656 987 938 909 300 511 942 993 64555 866 397 548 719 310 721 352 603 874 56576 807 158 529 320 931 762 213 684 575 286217 768 339 330 141 172 823 494 585 496 627378 149 340 351 582 433 304 595 706 37 988959 350 561 992 43 114 605 916 447 598 769360 771 402 653 924 615 126 857 208 579 370981 812 263 734 625 336 267 818 389 380 191222 873 544 635 546 677 428 199 390 401 632483 354 645 756 87 38 9 400 611 42 93164 655 966 497 648 819 410 821 452 703 974665 176 907 258 629 420 31 862 313 784 675386 317 868 439 430 241 272 923 594 685 596727 478 249 440 451 682 533 404 695 806 13788 59 450 661 92 143 214 705 16 547 698869 460 871 502 753 24 715 226 957 308 679470 81 912 363 834 725 436 367 918 489 480291 322 973 644 735 646 777 528 299 490 501732 583 454 745 856 187 138 109 500 711 142193 264 755 66 597 748 919 510 921 552 80374 765 276 7 358 729 520 131 962 413 884775 486 417 968 539 530 341 372 23 694 785696 827 578 349 540 551 782 633 504 795 906237 188 159 550 761 192 243 314 805 116 647798 969 560 971 602 853 124 815 326 57 408779 570 181 12 463 934 825 536 467 18 589580 391 422 73 744 835 746 877 628 399 590601 832 683 554 845 956 287 238 209 600 811242 293 364 855 166 697 848 19 610 21 652

8

Page 9: IR4PRS Generisanje Pseudoslucajnih Brojeva

903 174 865 376 107 458 829 620 231 62 513984 875 586 517 68 639 630 441 472 123 794885 796 927 678 449 640 651 882 733 604 8956 337 288 259 650 861 292 343 414 905 216747 898 69 660 71 702 953 224 915 426 157508 879 670 281 112 563 34 925 636 567 118689 680 491 522 173 844 935 846 977 728 499690 701 932 783 654 945 56 387 338 309 700911 342 393 464 955 266 797 948 119 710 121752 3 274 965 476 207 558 929 720 331 162613 84 975 686 617 168 739 730 541 572 223894 985 896 27 778 549 740 751 982 833 704995 106 437 388 359 750 961 392 443 514 5316 847 998 169 760 171 802 53 324 15 526257 608 979 770 381 212 663 134 25 736 667218 789 780 591 622 273 944 35 946 77 828599 790 801 32 883 754 45 156 487 438 409800 11 442 493 564 55 366 897 48 219 810221 852 103 374 65 576 307 658 29 820 431262 713 184 75 786 717 268 839 830 641 672323 994 85 996 127 878 649 840 851 82 933804 95 206 537 488 459 850 61 492 543 614105 416 947 98 269 860 271 902 153 424 115626 357 708 79 870 481 312 763 234 125 836767 318 889 880 691 722 373 44 135 46 177928 699 890 901 132 983 854 145 256 587 538509 900 111 542 593 664 155 466 997 148 319910 321 952 203 474 165 676 407 758 129 920531 362 813 284 175 886 817 368 939 930 741772 423 94 185 96 227 978 749 940 951 18233 904 195 306 637 588 559 950 161 592 643714 205 516 47 198 369 960 371 2 253 524215 726 457 808 179 970 581 412 863 334 225936 867 418 989 980 791 822 473 144 235 146277 28 799 990 1 232 83 954 245 356 687638 609 0 211 642 693 764 255 566 97 248419 10 421 52 303 574 265 776 507 858 22920 631 462 913 384 275 986 917 468 39 30841 872 523 194 285 196 327 78 849 40 51282 133 4 295 406 737 688 659 50 261 692743 814 305 616 147 298 469 60 471 102 353624 315 826 557 908 279 70 681 512 963 434325 36 967 518 89 80 891 922 573 244 335246 377 128 899 90 101 332 183 54

Ako želimo da postignemo bolju izlaznu sekvencu, tj. sekvencu sa boljom “slučajnošću” (testove generatora ćemo posebno obraditi) možemo koristiti dva LKG, čime dobijamo M generator. Ideja je sledeća: koristimo jedan LKG kako bismo generisali sekvencu slučajnih brojeva dužine n. Zatim, korišćenjem drugog LKG generišemo jedan slučajan broj k koji se nalazi između 1 i n. U izlazni niz stavljamo k-ti broj u prvoj sekvenci, zatim ponovo generišemo broj između 1 i n i tako dalje. Algoritam se može prikazati u pseudokodu:1. generisati niz Vi pomoću LKG1, i = 1,2,…,n2. generisati slučajan broj k između 1 i n pomoću LKG23. u nizu V pronaći k-ti element, Vk

4. u izlazni bafer staviti Vk

5. generisati novu vrednost za Vk

6. ponavljati korake 2-5 dok se ne dobije sekvenca željene dužine

9

Page 10: IR4PRS Generisanje Pseudoslucajnih Brojeva

Postupak se može prikazati sledećom šemom:

k

V

V

V

1

k

n

LKG2

LKG1

izlaz1

2

3

45

Očigledan nedostatak M-generatora je spor rad. Naime, on je približno dva puta sporiji od multiplikativnog i mešovitog. Međutim, njegovom primenom se dobija znatno bolja izlazna sekvenca.

Generisanje slučajnih brojeva sa proizvoljnom raspodelom

• korišćenje uniformne raspodele• proizvoljna raspodela (primer)• eksponencijalna raspodela• normalna raspodela

U prethodnom delu smo obratili posebnu pažnju na generatore slučajnih brojeva sa uniformnom raspodelom. Rekli smo da se pomoću njih može generisati sekvenca sa proizvoljnom raspodelom. Tu tvrdnju ćemo ovde i dokazati.

Neke je u slučajna promenljiva sa standardnom uniformnom raspodelom, tj. neka je definisana na intervalu [0,1] i neka su gustina raspodele i funkcija raspodele na tom intervalu:

fu(x) = 1 i Fu(x) = xPostavlja se sledeći problem: formirati slučajnu promenljivu r = g(u), tako da ona ima unapred zadatu funkciju raspodele Fr (x). Dakle, za poznatu funkciju Fr (x) treba odrediti g(u).Pođimo od definicije funkcije raspodele:

10

Page 11: IR4PRS Generisanje Pseudoslucajnih Brojeva

Fr (x) = P[r ≤ x] = P[g(u) ≤ x] = P[g-1(g(u)) ≤ g-1(x)] = P[u ≤ g-1(x)]Pošto smo pretpostavili da slučajna promenljiva u ima standardnu uniformnu raspodelu (F(x)=x), sledi:

Fr (x) = g-1(x)

Iz ove jednačine se dobija:

g(x) = Fr-1 (x)

Ako zamenimo x→u, zbog r = g(u) se konačno dobija:

r = Fr-1 (u)

Upotrebom izvedenog rezultata i nekog generatora sa uniformnom raspodelom, možemo napraviti generator sa proizvoljnom raspodelom. Na primer, neka je potrebno generisati pseudoslučajne brojeve čija je gustina raspodele verovatnoće:

f(x)=asinx (0 < x < π)Funkcija gustine raspodele je prilično egzotična, ali se korišćenjem prethodnog rezultata problem vrlo brzo rešava. Data gustina raspodele izgleda:

π

a

x

f(x)

Za primenu izvedene jednačine nam je potrebna raspodela F(x). Dobijamo je integracijom:

f x( )∞

xxf x( ) d a 1 cosx( )

Konstantu a nalazimo iz uslova F(π)=1, pa sledi a=1/2. Dakle, funkcija raspodele je:

F x( )1 cosx

2Iz gornjeg razmatranja smo videli da važi:

u = F(r) ir = F-1 (u),

gde je u slučajna promenljiva sa standardnom uniformnom raspodelom. Dalje je:

u1 cosr

2

11

Page 12: IR4PRS Generisanje Pseudoslucajnih Brojeva

cosr= 1 – 2ur = arccos(1 – 2u)

što predstavlja i rešenje problema. Ako na raspolaganju imamo generator slučajnih brojeva sa uniformnom raspodelom urng(), tada se željeni generator realizuje u par linija koda:

#include <math.h>double urng(void);double sinrng(void) {

double x=1-2*urng();return atan(sqrt(1-x*x)/x) + 3.1415/2;

}

Jedina modifikacija je bila trigonometrijska transformacija funkcije arccos u arctg kako bi kompajler mogao korektno da prevede izraz.

Pogledaćemo i na koji način se mogu realizovati generatori slučajnih brojeva sa eksponencijalnom i normalnom raspodelom.Neka je potrebno generisati slučajnu promenljivu s koja ima eksponencijalnu raspodelu, tj. za koju važi:

0 ≤ s ≤ ∞f(x) = λexp(-λx), x >0

F(x) = 1- exp(-λx), x > 0

Neka je 1-u slučajna promenljiva sa standardnom uniformnom raspodelom. Tada je:

s = F-1 (1-u)

F(s) = F ( F-1 (1-u)) = 1-u

1-u = 1- exp(-λx)

u = exp(-λs)

ln(u) = -λs

sln u( )λ

Dakle, dobili smo vezu između tražene slučajne promenljive s i slučajne promenljive u sa standardnom uniformnom raspodelom.

Na sličan način možemo realizovati i generator slučajnih brojeva sa normalnom raspodelom. Neka je data slučajna promenljiva u sa uniformnom raspodelom:

f x( ) 1 F x( ) x

12

Page 13: IR4PRS Generisanje Pseudoslucajnih Brojeva

E u( )µ12

σVar u( )1

12Formirajmo slučajnu promenljivu Y kao zbir n slučajnih promenljivih sa uniformnom raspodelom. Prema centralnoj graničnoj teoremi, Y mora imati normalnu raspodelu:

YSn nµ

σn

1

n

i

uin2

=

n12

U praksi se najčešće uzima n = 12, pa se slučajna promenljiva Y formira kao:

Y

1

12

i

ui 6

=

Možemo zaključiti da je za generisanje slučajne promenljive sa normalnom raspodelom dovoljno imati generator slučajnih brojeva sa uniformnom raspodelom. Proces se odvija tako što generišemo željeni broj uniformno raspodeljenih slučajnih brojeva, saberemo ih i dobili smo normalno raspoređenu slučajnu promenljivu.

Hardversko generisanje slučajnih brojeva• generisanje slučajnih brojeva upotrebom pomeračkih registara

Za generisanje slučajnih brojeva se može iskoristiti i posebna klasa kružnih brojača. Posmatrajmo pomerački registar od n bita. Može se pokazati da uvek postoji bar jedna funkcija povratne sprege za koju će registar zauzeti 2n – 1 različitih stanja pre nego što se ciklus ponovi. Zabranjeno stanje je sve nule.U tabeli koja sledi su prikazane funkcije povratne sprege za registre dužine od 2 do 32 bita:

n (broj bita) jednačina povratne sprege2 SIN2 = Q1 ⊕ Q0

3 SIN3 = Q2 ⊕ Q1

4 SIN4 = Q3 ⊕ Q2

5 SIN5 = Q4 ⊕ Q2

6 SIN6 = Q5 ⊕ Q4

7 SIN7 = Q6 ⊕ Q3

8 SIN8 = Q7 ⊕ Q5 ⊕ Q4⊕ Q3

12 SIN12 = Q11 ⊕ Q10 ⊕ Q7⊕ Q5

16 SIN16 = Q15 ⊕ Q12 ⊕ Q11⊕ Q10

20 SIN20 = Q19 ⊕ Q16 24 SIN24 = Q23 ⊕ Q22 ⊕ Q21⊕ Q16

28 SIN28 = Q27 ⊕ Q24

13

Page 14: IR4PRS Generisanje Pseudoslucajnih Brojeva

32 SIN32 = Q31 ⊕ Q30 ⊕ Q29⊕ Q9

Iz tabele se vidi da je serijski ulaz SINi funkcija povratne sprege koja se dovodi na D ulaz flipflopa Q0. Ovde je pretpostavljeno da je Q0 bit najmanje težine.Na slici je prikazan primer realizacije četvorobitnog generatora slučajnih brojeva:

Ako je početno stanje 1, generator će dati sledeću sekvencu slučajnih brojeva: 1, 2, 4, 9, 3, 6, 13, 10, 5, 11, 7, 15, 14, 12, 8. Međutim, u ovoj realizaciji problem predstavlja stanje sve nule. Naime, ako bi se brojač po uključenju ili zbog smetnji našao u stanju nula, SIN bi bilo jednako nuli i generator bi stao. Očigledno se mora uvesti dodatna logika koja će obezbediti da se izađe iz zabranjenog stanja. Modifikovani generator je prikazan na slici:

Ovaj generator dekoduje stanje nula i na sledeći taktni impuls prelazi u dozvoljeno stanje 1.

14

Page 15: IR4PRS Generisanje Pseudoslucajnih Brojeva

Testiranje generatora slučajnih brojeva• hi-kvadrat test• test Kolmogrova-Smirnova• test k-torki• poker test• test permutacija• test maksimuma (minimuma)• test podsekvenci• test pomoću Monte Carlo simulacije problema čije je rešenje poznato• Floyd-ov algoritam

Kada govorimo o testiranju generatora slučajnih brojeva, mislimo na sledeće:1) testiranje kvaliteta slučajnosti2) testiranje verodostojnosti (da li slučajna sekvenca zadovoljava pretpostavljenu

raspodelu)3) otkrivanje petlji (cikličkog ponavljanja) u sekvenci

Za testiranje generatora slučajnih brojeva se koriste statistički testovi. Smisao statističkih testova je postavljanje hipoteze o nekoj osobini slučajne promenljive, utvrđivanje potrebnog i dovoljnog faktora poverenja i provera hipoteze. U zavisnosti od rezultata dobijenih primenom testa i zahtevanog faktora poverenja, hipoteza se prihvata ili odbacuje.Najpoznatiji statistički test koji se u primenjuje u ovu svrhu je hi-kvadrat test (χ2 –test). Cilj hi-kvadrat testa je da proveri u kojoj se meri raspodela slučajnih brojeva u dobijenoj sekvenci slaže sa nekom unapred pretpostavljenom (zadatom), tj. očekivanom raspodelom. Test se vrši na sledeći način:1. generiše se sekvenca slučajnih brojeva X0, X1, X2,…, Xn-1

2. opseg vrednosti slučajnih promenljivih [Xmin, Xmax] se podeli na m jednakih intervala (intervali ne moraju biti jednaki, ali najčešće jesu)

3. za svaki interval se odredi broj vrednosti Xi koje se u njemu nalaze – na taj način se dobija frekvencija fi , i=1,2,…,m za svaki interval

4. odredi se teorijska raspodela slučajnih brojeva (tj. očekivana, jer mi proveravamo da li se dobijena sekvenca slaže sa zahtevanom raspodelom)

5. koristeći dobijene podatke o željenoj raspodeli, odredi se teorijska frekvencija Fi

za svaki interval6. ako je u nekom intervalu fi <5 ili Fi <5, vršimo spajanje intervala kako bi u

svakom bilo barem 5 dobijenih i teoretski predviđenih vrednosti, a zatim za nove intervale ponovo računamo fi i Fi

7. formiramo vrednost χ2 prema sledećoj jednačini:

χ2

1

m

i

fi Fi2

Fi=8. određujemo broj stepeni slobode (DF – degrees of freedom) kao DF=m-p-1, gde

je p broj parametara karakterističan za očekivanu raspodelu (za normalnu p=2 (µ, σ), za eksponencijalnu p=1 (λ) i za uniformnu p=0)

15

Page 16: IR4PRS Generisanje Pseudoslucajnih Brojeva

9. usvajamo vrednost faktora α koji određuje rizik prihvatanja hipoteze da generisana sekvenca ima pretpostavljenu raspodelu (faktor 1 - α predstavlja nivo poverenja za postavljenu hipotezu)

10. zatim određujemo vrednost funkcije χα2(DF, α) koja se računa ili čita iz tabela kao

što je sledeća:

DF|α 0.99 0.95 … 0.05 0.011 0.000154 0.004 … 3.84 6.632 0.02 0.1 … 5.99 9.213 0.115 0.352 … 7.81 11.34… … … … … …30 14.95 18.49 … 43.77 50.89

11. ako je χ2 > χα2 hipoteza se odbacuje, a ako je χ2 < χα

2 hipoteza se prihvata; naravno, ako je χ2 < χα

2 ne znači da je hipoteza apsolutno tačna, jer se uvek može pooštriti nivo poverenja ili izvršiti dopunsko testiranje.

Da bismo videli kako se ovaj test primenjuje, posmatrajmo sledeći primer. Neka je u toku 420 dana beležen broj kvarova u jednom elektroenergetskom sistemu i neka su dobijeni sledeći podaci:

broj kvarova 0 1 2 3 4 5 6broj slučajeva 87 142 106 57 21 5 2

Zadatak je da sa nivoom značajnosti od 0.05 proverimo hipotezu da broj kvarova ima Poisson-ovu raspodelu.Prvo treba izračunati teorijsku raspodelu. Poisson-ova raspodela opisuje diskretne slučajne promenljive funkcijom raspodele:

P xkexpλ( )λk.

k!

Iz navedenih vrednosti se može proceniti parametar λ raspodele kao λ = µ = 1.538. Na osnovu toga možemo naći verovatnoće i frekvencije:

0 1 2 3 4 5 6Fi 90.3 138.6 106.68 54.5 21 6.3 1.68fi

Ne moramo ni računati vrednost fi jer u poslednjem intervalu imamo F6 < 5 pa moramo spojiti intervale 5 i 6. Sada se dobija nova tabela:

0 1 2 3 4 {5,6}Fi 90.3 138.6 106.68 54.6 21 7.98fi 87 142 106 57 21 7

Koršćenjem ovih vrednosti se računa χ2 = 0.434. Iz tabele se dobija (za p=1) χα2=9.488. Pošto je χ2 < χα

2 prihvatamo hipotezu da promenljiva ima Poisson-ovu raspodelu.

16

Page 17: IR4PRS Generisanje Pseudoslucajnih Brojeva

Pored hi-kvadrat testa, veoma popularan je i test Kolmogrova-Smirnova. Test se vrši na sledeći način: posmatrajmo uzorak slučajnih brojeva xi, i=1,2,…n. Formira se empirijska zbirna funkcija raspodele verovatnoće S(x) (na osnovu više merenja). Zatim se računa teorijska raspodela verovatnoće F(x) i formiraju se razlike |F(xi) – S(xi)|. Sledeći korak je nalaženje maksimalne razlike:

D= max (|F(xi) – S(xi)| ), za 1 ≤ i ≤ N, gde je N broj merenjaIz tabela se za željeni nivo poverenja α nalazi vrednost Dα(α, N). Ako je D ≤ Dα , hipoteza da x ima raspodelu F(x) se prihvata, a inače se odbacuje.Na primer, neka smo u 125 merenja dobili sledeće rezultate:

x S(x) F(x) |F(x) – S(x)|2 0.104 0.006 0.0985 0.240 0.116 0.1248 0.408 0.456 0.04811 0.744 0.803 0.05914 0.872 0.959 0.08717 0.960 0.995 0.03520 1.000 1.000 0.000

Neka je faktor poverenja α=0.05. Iz tabele se vidi da je D=0.124, a pošto je D0,05=0.122, sledi da se hipoteza odbacuje.

Testovi iz naredne grupe su empirijski testovi. U većini slučajeva se svode na primenu hi-kvadrat ili testa Kolmogrova-Smirnova na neku jednostavnu funkciju kojom transformišemo slučajnu sekvencu.

test k-torkiMože se upotrebljavati za k=2,3,… Ako uzmemo k=2 dobija se test parova. Od vrednosti iz slučajne sekvence se formiraju parovi (Y2j, Y2j+1), gde je 0 ≤ j < n. Parovi se tretiraju kao koordinate tačaka u kvadratu dimenzija d x d. Zatim se vrši hi-kvadrat test kako bi se pokazalo da su parovi uniformno raspoređeni u kvadratu. U testu parova mora biti n > 5d2, za k = 3,4,… mora biti n > 5d3, n > 5d4…

poker test (particijski test)Od slučajne sekvence formiramo grupe od pet uzastopnih vrednosti: Y5j, Y5j+1, Y5j+2, Y5j+3, Y5j+4, gde je 0 ≤ j < n.Mogući su sledeći oblici petorki:1. sve različito (1+1+1+1+1)2. par (2+1+1+1)3. dva para (2+2+1)4. tri ista (3+1+1)5. ful (3+2)6. poker (4+1)7. pet istih (5)Sada na ovako formirane grupe primenjujemo hi-kvadrat test, ali za slučajnu promenljivu koja označava pojavljivanje neke od mogućih kombinacija.

test permutacijaSlučajna sekvenca se podeli na grupe od t elemenata. U svakoj grupi se najmanji element označi sa 1, sledeći sa 2,… i najveći sa t. Pošto su svih t! permutacija

17

Page 18: IR4PRS Generisanje Pseudoslucajnih Brojeva

jednako verovatne, primenjuje se hi-kvadrat test na slučajnu promenljivu koja označava pojavljivanje mogućih permutacija.

test maksimuma (minimuma)Sekvenca slučajnih brojeva se podeli na grupe od t elemenata: Ujt, Ujt+1, … , U(j+1)t-

1. Formirajmo slučajnu promenljivuWj= [max(Ujt, Ujt+1, … , U(j+1)t-1)] t

Može se pokazati da ove slučajne promenljive imaju uniformnu raspodelu na intervalu (0,1). Primenom hi-kvadrat testa ili testa Kolmogrov-Smirnova na hipotezu da sekvenca Wj ima uniformnu raspodelu može se proveriti kvalitet generatora slučajnih brojeva.

test podsekvenciOd sekvence slučajnih brojeva se formira k podsekvenci na sledeći način:U0, Uk, U2k, …U1, Uk+1, U2k+1,…………………….Uk-1, U2k-1, U3k-1,…Zatim se svaka sekvenca testira na željenu raspodelu.

test pomoću Monte Carlo simulacije čije je rešenje poznatoOvde ćemo prikazati kako se slučajni brojevi koriste u Monte Carlo simulacijama, i kako se na sličan način može proceniti kvalitet generatora. Osnovni princip Monte Carlo simulacija je sledeći: neka je na segmentu [a,b] data funkcija x→f(x). Pomoću nekog generatora slučajnih brojeva sa uniformnom raspodelom treba generisati n argumenata x1, x2, x3,…, xn za koje izračunavamo vrednosti funkcije f(x1), f(x2), f(x3),…, f(xn). Srednja vrednost funkcije na segmentu [a,b] je približno:

1

baa

bxfx()d.1N0

N

k

fxk=

.

odakle je:

a

bxf x( ) d

b aN

0

N

k

f xk

=

.

Na taj način dobijamo vrednost određenog integrala. Sada je jasno i na koji način možemo proveriti kvalitet generatora slučajnih brojeva. Jednostavno treba primeniti sekvencu slučajnih brojeva na rešavanje određenog integrala čije je rešenje poznato i na osnovu odstupanja rešenja od tačnog se može zaključiti koliko je sekvenca bila kvalitetna.

Na kraju ćemo prikazati i Floyd-ov algoritam koji služi za izbegavanje ciklusa u sekvenci slučajnih brojeva. Još na početku smo napomenuli da se zbog konačne dužine memorijskih reči, pre ili kasnije sekvenca slučajnih brojeva mora ponoviti. Posmatrajmo generator tipa Xi+1 = F (Xi), i =1,2,…m. Ciklus se tada javlja na sledeći način:

X0, X1, X2,…, Xµ,… Xµ+λ-1, Xµ+λ,…

18

Page 19: IR4PRS Generisanje Pseudoslucajnih Brojeva

Praktično se dešava da su vrednosti Xk+λ i Xk jednake, pri čemu je λ dužina ciklusa. Da bi se izbeglo javljanje ciklusa osnovni generator se mora modifikovati na sledeći način:1. X = X0; Y=Y0 (zadavanje početnih vrednosti)2. R = X (izlaz)3. X = f (X)4. Y =f ( f (Y) )5. ako je X različito od Y prelazi se na korak 2.6. krajUpotrebom ovog algoritma se garantuje generisanje bar λ različitih elemenata pre obustavljanja rada. Problem je što se vreme generisanje sekvence utrostručuje.

2) Helermanova formula

Helermanova formula pokazuje kako se menja efektivna širina opsega memorije ukoliko je memorija podeljena na m blokova kojima se može nezavisno pristupati. Neka je W dužina podatka, tj. broj bita koji se zahvati pri jednom pristupu memoriji i neka je Tc srednje vreme potrebno za dva uzastopna pristupa (čitanje ili pisanje) istoj adresi. Tada se širina opsega memorije definiše kao:

BmemWTc

Ovo razmatranje, međutim, ne važi ako se istovremeno (paralelno) može pristupati (čitati ili upisivati) na više adresa. Neka je memorija podeljena na m blokova i neka se svakom bloku može nezavisno pristupati. Idealno bi bilo kada bismo uspeli da u svakom ciklusu generišemo pristup različitim blokovima. Pošto je to nemoguće, širina opsega memorije se u tom slučaju definiše kao:

Bmem S m( )WTc

.

gde je S(m) faktor simultanosti, koji služi da kvantitativno opiše verovatnoću da ćemo u jednom ciklusu pristupa memoriji uspeti da generišemo adrese iz bar k različitih blokova, 1 ≤ k ≤ m. Iz tog razloga je očigledno da mora biti 1 ≤ S(m) ≤ m.Može se pokazati da je:m64

Sm()m1()!

1

m

k

k2

mkmk()!.=

.

Pošto je ovaj izraz teško računati, Helerman je red aproksimirao na sledeći način:

S(m) ≈ m0.56

Istim problemom se bavio i Donald Knuth i pokazao da su bolje aproksimacije:

Sm()1.253m0.28

i poboljšana varijanta:

19

Page 20: IR4PRS Generisanje Pseudoslucajnih Brojeva

Sm()πm213

1π2m.

124135m

Naš zadatak je ispitamo grešku Helermanove aproksimacije, pronađemo treću decimalu u njegovoj formuli i da pokušamo da aproksimiramo red S(m) nekim polinomom što veće tačnosti.

Prvo ispitujemo grešku. U paketu MathCad Professional 7.0 je napisan program koji izračunava vrednosti reda S(m) za 20 vrednosti argumenta m, nalazi vrednost m0.56 i daje apsolutnu grešku aproksimacije, tj. S(m) – m0.56. Rezultati su dati u tabeli i na grafikonu.

m S(m) m0.56 S(m) - m0.56

2 1.5 1.474269217291101 0.0257307827088994 2.21875 2.173469725052116 0.0452802749478846 2.774691358024691 2.727499629176277 0.0471917288484148 3.245018005371094 3.204279510358489 0.04073849501260610 3.66021568 3.630780547701014 0.02943513229898612 4.036073675098951 4.021068743467478 0.01500493163147314 4.38202942438352 4.383607890388229 -1.578466004708901E-316 4.704258247072678 4.723970645718122 -0.01971239864544418 5.007063098992893 5.046062238772102 -0.03899913977920920 5.2935845860009 5.35274799621493 -0.0591634102140322 5.566198227860144 5.646205766852149 -0.08000753899200524 5.826752503922588 5.928137869105512 -0.10138536518292426 6.076719362686104 6.199905570013224 -0.1231862073271228 6.317293595343384 6.462618173473749 -0.14532457813036530 6.549460831033025 6.717194174121843 -0.16773334308881932 6.774045476669739 6.964404506368995 -0.19035902969925548 8.364353580280728 8.73967117627992 -0.37531759599919264 9.705781250786002 10.26740718050324 -0.56162592971723496 11.95694307090473 12.8846281844358 -0.927685113531068

-1

-0.8

-0.6

-0.4

-0.2

0

0.2

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 48 64 96

m

greš

ka

greška aproksimacije m0.56

20

Page 21: IR4PRS Generisanje Pseudoslucajnih Brojeva

Iz tabele i sa grafikona se mogu zaključiti dve stvari:1) za male vrednosti argumenta m (do 12), greška je pozitivna, a za veće vrednosti je

negativna2) apsolutna vrednost greške raste sa porastom argumenta m, što se može videti sa

sledećeg grafika:

00.1

0.20.30.40.5

0.60.70.8

0.91

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 48 64 96m

greš

ka

apsolutna vrednost greške aproksimacije m0.56

Sledeći problem je bio nalaženje treće decimale u eksponentu Helermanove aproksimacije. Problem je verovatno rešiv i analitički, ali ja nisam uspeo da pronađem matematički aparat kojim bih mogao da aproksimiram takav red polinomom čiji stepen nije ceo broj. Sve aproksimacije koje su mi poznate iz numeričke matematike se svode na nalaženje polinoma oblika:

an-1xn-1 + an-2xn-2 + … + a1x + a0

gde se koeficijenti računaju na razne načine (interpolacioni polinomi, metod najmanjih kvadrata, linearna regresija). Dodatni problem je bio to što se samo metod linearne regresije definiše za diskretne funkcije.Iz tog razloga sam problem počeo da rešavam primenom “grube sile”. Ideja je bila da se pronađu vrednosti funkcije za nekoliko vrednosti argumenta m za sve moguće vrednosti treće decimale u eksponentu (znači za m0.561, m0.562, …, m0.569) i da se računanjem odstupanja od tačne vrednosti S(m) pronađe za koju treću decimalu se dobija najmanja greška.

Rešenje je dobijeno pisanjem programa u paketu MathCad 7.0 koji je odmah računao vrednosti grešaka za devet vrednosti argumenta m.Dobijeni rezultati su prikazani u sledećim tabelama (navedene su apsolutne vrednosti grešaka):

21

Page 22: IR4PRS Generisanje Pseudoslucajnih Brojeva

m0.561

m greška2 0.0247085429171614 0.0422651166583926 0.0423003247593398 0.0340684505072810 0.02106531872792816 0.03282820034185324 0.12025527535760732 0.21453769066381664 0.604415793094125

m0.562

m greška2 0.0236855943171674 0.0392457755733446 0.0374001485942918 0.02738452160343110 0.01267621074392116 0.04598041722096424 0.13918525051692132 0.23880029385854264 0.647383985076829

m0.563

m greška2 0.0226619364174394 0.036222245890136 0.0324911846217318 0.02068667939922410 4.267763868751384E-316 0.05916915038719424 0.1581754818542732 0.26314713070974464 0.690531248857516

m0.564

m greška2 0.0216375687261584 0.0331945217980956 0.0275734170819068 0.01397489493266210 4.160066478332336E-316 0.07239450122567924 0.17722616117165232 0.28757849365549964 0.733858330725656

22

Page 23: IR4PRS Generisanje Pseudoslucajnih Brojeva

m0.565

m greška2 0.0206124907511634 0.0301625974785216 0.0226468301868028 7.249139181460862E-310 0.01260732498084616 0.08565657140303624 0.19633748088158632 0.31209467614914464 0.777365980080901

m0.566

m greška2 0.0195867019999514 0.0271264671046196 0.0177114081200918 5.093830629236962E-410 0.02107405642531416 0.09895546286815524 0.21550963400906432 0.33669597266282164 0.821054949446062

m0.567

m greška2 0.018560201979684 0.0240861248415146 0.0127671350370798 6.244402566185414E-310 0.02956030570150316 0.01276713503707924 0.23474281419349632 0.36138267869100164 0.864925994480116

m0.568

m greška2 0.0175329901971654 0.0210415648462416 7.813995064656965E-38 0.01301224690976710 0.03806611780266216 0.12566411887330624 0.25403721569066732 0.38615509075403964 0.90897987399129

23

Page 24: IR4PRS Generisanje Pseudoslucajnih Brojeva

m0.569

m greška2 0.0165050661588784 0.0179927812677266 2.851972301251671E-38 0.01979417923251210 0.0465915378257616 0.13907408872953724 0.27339303337470432 0.41101350640173464 0.953217349950171

Prvobitna zamisao je bila da se zatim vrednosti grešaka prikažu na jednom grafiku i da se jednostavno izabere decimala sa najmanjom greškom, tj. grafikon koji ide ispod svih ostalih. Umanjena verzija tog grafikona je prikazana na sledećoj slici:

0

0.2

0.4

0.6

0.8

1

1.2

Međutim, pokazalo se da se greška ponaša neočekivano: grafikoni se seku. Na primer, na grafikonu ispod je prikazano ponašanje za samo dve decimale. Vidi se da je za manje vrednosti argumenta m svetlija kriva ispod tamnije, ali da je za velike vrednosti m obrnuto: svetlija kriva je iznad tamnije. Dakle, na ovaj način se ne može zaključiti za koju decimalu se dobija minimalna greška.

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

24

Page 25: IR4PRS Generisanje Pseudoslucajnih Brojeva

Sledeća ideja je bila pronalaženje relativne vrednosti greške. Pošto smo videli da se apsolutna vrednost greške uvećava sa porastom parametra m, srednja vrednost se nije mogla naći prostim sabiranjem svih grešaka, jer bi na taj način skoro potpuno potisnuli uticaj grešaka pri malim vrednostima m. Zato je relativna vrednost nađena upotrebom sledeće formule:

δi

δ1

m1

δ2

m2

...δ

9

m9

9Na taj način su dobijeni sledeći rezultati:

eksponent relativna vrednost greške

0.561 0.0066162660.562 0.0065365920.563 0.0064573280.564 0.0064709220.565 0.00658022010.566 0.0066903290.567 0.0070830270.568 0.0072746010.569 0.007575687

Minimalna greška se dobija za eksponent 0.563, što se vidi i sa sledećeg grafika:

1 2 3 45

6

78

9

0.00580.0060.00620.00640.00660.00680.0070.00720.00740.00760.0078

treca decimala

greš

ka

Dakle, Helermanova aproksimacija sa tri decimale u eksponentu izgleda:

S(m) ≈ m0,563

Preostao je još problem aproksimacije reda S(m) polinomom. Upotrebićemo postupak linearne regresije. Ideja je da red S(m) prikažemo kao:

S(m) = C0 + C1mKoeficijenti C0 i C1 se nalaze iz sistema jednačina:

25

Page 26: IR4PRS Generisanje Pseudoslucajnih Brojeva

NC01

N

i

mkC1=1

N

k

Smk=

1

N

k

mkC0=1

N

k

m2kC1=1

N

k

mkSmk=

Jedino pitanje koje se ovde postavlja je izbor mk i N, tj. kako ćemo tabelirati diskretnu funkciju. Ako uzmemo svih 19 vrednosti koje smo tabelirali dobićemo polinom:

S(m) ≈ 0.10837m + 2.73

Ovde pravimo veliku grešku za male vrednosti argumenta m. Međutim, kako m raste, tako se i tačnost popravlja. Razlog je način na koji smo tabelirali funkciju. Naime, nismo uzeli ekvidistantni raspored vrednosti mk. Ako na primer izbacimo tri najveće vrednosti m, dobijamo drugačiji polinom:

S(m) ≈ 0.1663m + 1.79

Sada za male vrednosti m dobijamo bolju tačnost.Generalno gledano, ovo nije najsrećniji problem za linearnu regresiju. Međutim, mogli bismo postići veću tačnost ako bismo izvršili aproksimaciju polinomom višeg stepena (metod najmanjih kvadrata) ili ako bismo pažljivije izvršili analizu greške kod linearne regresije. Tada bismo mogli (metodom probanja) da nađemo kako treba tabelirati red S(m) kako bi greška aproksimacije bila minimalna. Takođe, pošto greška raste sa porastom vrednosti argumenta m, mogli bismo skup vrednosti S(m) podeliti u više podintervala i svaki aproksimirati posebnim polinomom, na isti način na koji smo to već uradili za ceo skup vrednosti. Smanjivanjem koraka i povećanjem broja intervala bismo mogli postići proizvoljnu tačnost.

Literatura

1. Donald E. Knuth, The Art of Computer Programming, Volume 2: Seminumerical Algorithms

2. Dobrilo Đ. Tošić, Uvod u numeričku analizu3. Milan Merkle, Verovatnoća i statistika4. Dejan B Živković, Miodrag V. Popović, Impulsna i digitalna elektronika5. Vladan Devedžić, folije sa predavanja iz predmeta Progamski jezici i metode

programiranja6. Laslo Kraus, beleške sa vežbi iz predmeta Programski jezici i metode

programiranja

26