<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?action=history&amp;feed=atom&amp;title=KADD_2017_Zadanie_6</id>
		<title>KADD 2017 Zadanie 6 - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?action=history&amp;feed=atom&amp;title=KADD_2017_Zadanie_6"/>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=KADD_2017_Zadanie_6&amp;action=history"/>
		<updated>2026-04-06T12:27:36Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.16.5</generator>

	<entry>
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=KADD_2017_Zadanie_6&amp;diff=1793&amp;oldid=prev</id>
		<title>Lgraczyk: /* Zadanie */</title>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=KADD_2017_Zadanie_6&amp;diff=1793&amp;oldid=prev"/>
				<updated>2017-03-27T06:32:08Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Zadanie&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 06:32, 27 March 2017&lt;/td&gt;
		&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 18:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 18:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nie maja wspolnych dzielników,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nie maja wspolnych dzielników,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;b = g-1&amp;lt;/code&amp;gt; jest wielokrotnoscia kazdej liczby pierwszej &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, ktora jest dzielnikiem liczby &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;b = g-1&amp;lt;/code&amp;gt; jest wielokrotnoscia kazdej liczby pierwszej &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, ktora jest dzielnikiem liczby &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; jest wielokrotnością 4 jesli &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;tez &lt;/del&gt;jest wielokrotnością 4. &amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; jest wielokrotnością 4 jesli &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;też &lt;/ins&gt;jest wielokrotnością 4. &amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Dla uproszczenia należy przyjąć &amp;lt;code&amp;gt;c = 0&amp;lt;/code&amp;gt;, otrzymując w ten sposób multiplikatywny liniowy generator kongruentny (MLCG).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Dla uproszczenia należy przyjąć &amp;lt;code&amp;gt;c = 0&amp;lt;/code&amp;gt;, otrzymując w ten sposób multiplikatywny liniowy generator kongruentny (MLCG).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 68:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 68:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;** standardowego generatora ROOT'a &amp;lt;code&amp;gt;gRandom-&amp;gt;Rndm(1)&amp;lt;/code&amp;gt;. &amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;** standardowego generatora ROOT'a &amp;lt;code&amp;gt;gRandom-&amp;gt;Rndm(1)&amp;lt;/code&amp;gt;. &amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Narysować na jednym wykresie histogram (odpowiednio unormowany) oraz funkcję teoretyczną &amp;lt;code&amp;gt;f(x)&amp;lt;/code&amp;gt; (obiekt &amp;lt;code&amp;gt;TF1&amp;lt;/code&amp;gt;). (1 pkt.)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Narysować na jednym wykresie histogram (odpowiednio unormowany) oraz funkcję teoretyczną &amp;lt;code&amp;gt;f(x)&amp;lt;/code&amp;gt; (obiekt &amp;lt;code&amp;gt;TF1&amp;lt;/code&amp;gt;). (1 pkt.)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Uwagi ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Uwagi ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lgraczyk</name></author>	</entry>

	<entry>
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=KADD_2017_Zadanie_6&amp;diff=1792&amp;oldid=prev</id>
		<title>Lgraczyk: Created page with &quot;{| align=&quot;right&quot; | __TOC__ |}   == Zadanie ==  ''Część pierwsza'': '''liniowy kongruentny generator liczb losowych''' (1 pkt.)  Należy napisać generator liczb pseudolosowych...&quot;</title>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=KADD_2017_Zadanie_6&amp;diff=1792&amp;oldid=prev"/>
				<updated>2017-03-27T06:31:02Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;{| align=&amp;quot;right&amp;quot; | __TOC__ |}   == Zadanie ==  &amp;#39;&amp;#39;Część pierwsza&amp;#39;&amp;#39;: &amp;#39;&amp;#39;&amp;#39;liniowy kongruentny generator liczb losowych&amp;#39;&amp;#39;&amp;#39; (1 pkt.)  Należy napisać generator liczb pseudolosowych...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
''Część pierwsza'': '''liniowy kongruentny generator liczb losowych''' (1 pkt.)&lt;br /&gt;
&lt;br /&gt;
Należy napisać generator liczb pseudolosowych oraz zapisać wygenerowane liczby do pliku.&lt;br /&gt;
&lt;br /&gt;
Stworzony generator powinien opierać się na wzorze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x[j+1] = (g*x[j] + c) mod m.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generator taki nazywamy generatorem LCG - czyli generatorem liniowym kongruentnym. Zadanie pewnej wartości poczatkowej &amp;lt;code&amp;gt;x[0]&amp;lt;/code&amp;gt; definiuje nam zatem cały ciąg, który ponadto jest ciągiem okresowym. Okres zależy od doboru parametrów i przy spelnieniu kilku warunków osiąga maksymalnie wartość &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Warunki te to:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nie maja wspolnych dzielników,&lt;br /&gt;
* &amp;lt;code&amp;gt;b = g-1&amp;lt;/code&amp;gt; jest wielokrotnoscia kazdej liczby pierwszej &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, ktora jest dzielnikiem liczby &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; jest wielokrotnością 4 jesli &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; tez jest wielokrotnością 4. &lt;br /&gt;
&lt;br /&gt;
Dla uproszczenia należy przyjąć &amp;lt;code&amp;gt;c = 0&amp;lt;/code&amp;gt;, otrzymując w ten sposób multiplikatywny liniowy generator kongruentny (MLCG).&lt;br /&gt;
&lt;br /&gt;
* Wartości &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; oraz &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; powinny być łatwe do modyfikacji w programie. &lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;losowe1.dat, losowe2.dat, losowe3.dat&amp;lt;/code&amp;gt;, dla parametrów odpowiednio:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;m=97&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;g=23&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;m=32363&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;g=157&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;m=147483647&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;g=16807&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Część druga'': '''test widmowy''' (1 pkt.)&lt;br /&gt;
&lt;br /&gt;
Należy przeprowadzić test widmowy aby przetestować jakość generatora. By to zrobić należy narysować na płaszczyźnie punkty o współrzędnych &amp;lt;code&amp;gt;(x[n], x[n+1])&amp;lt;/code&amp;gt;. Uzyskany obraz utworzy wzór przypominający widmo generatora - stąd nazwa testu.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Do tworzenia wykresów widma poleca się użycie obiektów &amp;lt;code&amp;gt;TH2D&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wynikiem powinny być trzy wykresy widma.&lt;br /&gt;
&lt;br /&gt;
''Część trzecia'': '''generacja liczb losowych oparta na transformacji rozkładu jednorodnego''' (3 pkt.)&lt;br /&gt;
&lt;br /&gt;
Dowolna funkcja zmiennej losowej jest zmienną losową. Powstaje więc pytanie jaka jest gęstość zmiennej losowej Y jeżeli znana jest gęstość &amp;lt;code&amp;gt;f(x)&amp;lt;/code&amp;gt;. Zakładamy, że prawdopodobieństwo &amp;lt;code&amp;gt;g(y)dy&amp;lt;/code&amp;gt; jest równe &amp;lt;code&amp;gt;f(x)dx&amp;lt;/code&amp;gt;, gdzie &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt; odpowiada wartością &amp;lt;code&amp;gt;dy&amp;lt;/code&amp;gt;. Warunek jest spełniony dla odpowiednio małych &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt;. Wynika stąd, że:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;g(y) = dx/dy f(x)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz jeżeli założymy, że gęstość prawdopodobieństwa &amp;lt;code&amp;gt;f(x)&amp;lt;/code&amp;gt; wynosi 1 w &amp;lt;code&amp;gt;0&amp;lt;=x&amp;lt;=1&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;f(x) = 0&amp;lt;/code&amp;gt; dla &amp;lt;code&amp;gt;x&amp;lt;= 0 i x&amp;gt;1&amp;lt;/code&amp;gt; to powyższe równanie możemy zapisać w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;g(y)dy = dx = dG(y),&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;code&amp;gt;G(y)&amp;lt;/code&amp;gt; jest dystrybuantą zmiennej losowej &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Co po całkowaniu daje nam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x = G(y) =&amp;gt; y = G^-1(x).&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli zmienna losowa &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; ma rozkład jednostajny na odcinku pomiędzy 0 i 1 oraz jeśli znana jest funkcja odwrotna &amp;lt;code&amp;gt;G^-1(x)&amp;lt;/code&amp;gt; to funkcja &amp;lt;code&amp;gt;g(y)&amp;lt;/code&amp;gt; opisuje gęstość prawdopodobieństwa rozkładu zmiennej losowej Y.&lt;br /&gt;
&lt;br /&gt;
Używając tej metody należy wygenerować 10000 liczb z rozkładu:&lt;br /&gt;
&lt;br /&gt;
[[File:Lab06_wzor.png]]&lt;br /&gt;
&lt;br /&gt;
Dla &amp;lt;code&amp;gt;tau = 2&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Należy wygenerować 10000 liczb z rozkładu 0 do 1 używając generatora z części pierwszej.&lt;br /&gt;
* Analitycznie (na kartce) policzyć dystrybuantę tego rozkładu, a następnie funkcję odwrotną. (1 pkt.)&lt;br /&gt;
* Wygenerować rozkład &amp;lt;code&amp;gt;f(x)&amp;lt;/code&amp;gt; - wrzucając wygenerowane wartości do histogramu - korzystając z: (1 pkt.)&lt;br /&gt;
** liczb wygenerowanych wcześniej i wczytanych z plików &amp;lt;code&amp;gt;losowe1.dat, losowe2.dat, losowe3.dat&amp;lt;/code&amp;gt;,&lt;br /&gt;
** standardowego generatora ROOT'a &amp;lt;code&amp;gt;gRandom-&amp;gt;Rndm(1)&amp;lt;/code&amp;gt;. &lt;br /&gt;
* Narysować na jednym wykresie histogram (odpowiednio unormowany) oraz funkcję teoretyczną &amp;lt;code&amp;gt;f(x)&amp;lt;/code&amp;gt; (obiekt &amp;lt;code&amp;gt;TF1&amp;lt;/code&amp;gt;). (1 pkt.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Uwagi ==&lt;br /&gt;
* Wczytywanie danych z pliku:&lt;br /&gt;
 ifstream ifile;&lt;br /&gt;
 ifile.open(&amp;quot;dane.dat&amp;quot;);&lt;br /&gt;
 double val;&lt;br /&gt;
 while(ifile&amp;gt;&amp;gt;val)&lt;br /&gt;
 {&lt;br /&gt;
   cout&amp;lt;&amp;lt;val&amp;lt;&amp;lt;endl;&lt;br /&gt;
 }&lt;br /&gt;
 ifile.close();&lt;br /&gt;
&lt;br /&gt;
* Zapisywanie danych do pliku:&lt;br /&gt;
 ofstream ofile;&lt;br /&gt;
 ofile.open(&amp;quot;dane.dat&amp;quot;);&lt;br /&gt;
 for(int i=0;i&amp;lt;N;i++)&lt;br /&gt;
   ofile&amp;lt;&amp;lt;val&amp;lt;&amp;lt;endl;&lt;br /&gt;
 }&lt;br /&gt;
 ofile.close();&lt;br /&gt;
&lt;br /&gt;
== Wynik ==&lt;br /&gt;
Przykładowy rozkład dla parametrów:&lt;br /&gt;
* &amp;lt;code&amp;gt;m=97, g=23&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:lab06_n97_g23_2.png]]&lt;br /&gt;
* &amp;lt;code&amp;gt;m=2147483647, g=16807&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:lab06_n2147483647_g16807_2.png]]&lt;br /&gt;
&lt;br /&gt;
Przykładowy wynik transformacji rozkładu jednorodnego:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:lab06_b_2.png]]&lt;/div&gt;</summary>
		<author><name>Lgraczyk</name></author>	</entry>

	</feed>