KADD 2017 Zadanie 6From Łukasz Graczykowski(Difference between revisions)
Lgraczyk (Talk | contribs)
(Created page with "{| align="right" | __TOC__ |} == Zadanie == ''Część pierwsza'': '''liniowy kongruentny generator liczb losowych''' (1 pkt.) Należy napisać generator liczb pseudolosowych...") Newer edit → Revision as of 06:31, 27 March 2017
ZadanieCzęść pierwsza: liniowy kongruentny generator liczb losowych (1 pkt.) Należy napisać generator liczb pseudolosowych oraz zapisać wygenerowane liczby do pliku. Stworzony generator powinien opierać się na wzorze:
Generator taki nazywamy generatorem LCG - czyli generatorem liniowym kongruentnym. Zadanie pewnej wartości poczatkowej
Dla uproszczenia należy przyjąć
Efektem działania makra powinien być plik nazwa.dat zawierający ciąg wygenerowanych liczb dla zadanych parametrów. Makro należy uruchomić trzy razy, otrzymując trzy pliki:
Część druga: test widmowy (1 pkt.) Należy przeprowadzić test widmowy aby przetestować jakość generatora. By to zrobić należy narysować na płaszczyźnie punkty o współrzędnych Jeśli punkty będą rozłożone równomiernie generator można uznać za dobry. Jeśli zdecydowanie widać pewną okresowość - punkty powtarzają się wielokrotnie - generator nie działa poprawnie. Oczywiście na rozłożenie punktów wpływa jedynie dobór parametrów
Wynikiem powinny być trzy wykresy widma. Część trzecia: generacja liczb losowych oparta na transformacji rozkładu jednorodnego (3 pkt.) Dowolna funkcja zmiennej losowej jest zmienną losową. Powstaje więc pytanie jaka jest gęstość zmiennej losowej Y jeżeli znana jest gęstość
Teraz jeżeli założymy, że gęstość prawdopodobieństwa
gdzie
Jeśli zmienna losowa Używając tej metody należy wygenerować 10000 liczb z rozkładu: Dla
Uwagi
ifstream ifile; ifile.open("dane.dat"); double val; while(ifile>>val) { cout<<val<<endl; } ifile.close();
ofstream ofile; ofile.open("dane.dat"); for(int i=0;i<N;i++) ofile<<val<<endl; } ofile.close(); WynikPrzykładowy rozkład dla parametrów:
Przykładowy wynik transformacji rozkładu jednorodnego: |