====== Cvičení 12, Quick test, náhodná čísla, grafický výstup ======
===== náplň cvičení =====
==== Quick test ====
* Příprava na zkoušku
* Zkušební lehká úloha, která je bodována pouze pro Vaši informaci
* Body z tohoto testu nejsou započítávány do výsledných bodů cvičení ani zkoušky, jedná se pouze o informaci pro Vás, jak jste připraveni na zkoušku
==== Úkol 1: Asociativní pole a římská čísla ====
* Využijte následující asociativní pole k převodu římského čísla na dekadické číslo:
conv={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
* Převeďte na číslo např. MCMXCIX
==== Generování (pseudo)náhodných čísel ====
* Co je to "náhodné" číslo?
* Lze generovat náhodná čísla na deterministickém stroji?
* Pro generování opravdu náhodný čísel je nutné použít vnější zdroj, např. šum diody, což je ne vždy možné.
* Jiné řešení spočívá ve výpočtu takové řady čísel, která se na 'dostatečně krátkém' úseku jeví jako náhodná
* Nejčastěji používané: [[https://en.wikipedia.org/wiki/Linear_congruential_generator | LCG ]]
=== Princip LCG ===
* Generujeme posloupnost čísel $x_{n+1} = (ax_n + c)\,\, \mathrm{mod}\,\, m $
* kde $x_n$ je předchozí číslo, $x_{n+1}$ je následující číslo
* $a,c,m$ jsou konstanty.
* $m$ určuje periodu posloupnosti.
* Naprogramujte toto LCG s parametry $a=1$, $c=1$, $m=5$.
* Pozorujte, co se stane při $m=6$.
* Prvnímu číslu posloupnosti říkáme **seed**
=== Generování náhodných čísel v Pythonu ===
* Modul **random**
* funkce 'random()': generuje náhodné číslo z rovnoměrného rozdělení v rozsahu $<0,1)$.
* funkce 'randint(a,b)': náhodné int číslo z rovnoměrného rozdělení v rozsahu $
import random
for i in range(10):
print(random.random())
import random
for i in range(10):
print(random.randint(-10,10))
* Python defaultně nastavuje **seed** tohoto generátoru na aktuální čas.
* Seed lze nastavit ručně: ''random.seed( cislo )''
==== Vytváření jednoduché grafiky ====
* Existuje mnoho knihoven realizujících grafiku.
* Knihovna Matplotlib: {{http://matplotlib.org/}}
* podobné ovládání jako příkaz ''plot'' v Matlabu
Hlavní metodou je funkce matplotlib.pyplot.plt, ktera zobrazi vektor cisel:
from numpy import *
import matplotlib.pyplot as plt
x = arange(0.,10.,0.1)
y = sin(x)
plt.plot(y)
plt.show()
{{courses:b3b33alp:cviceni:graf1.png?300|}}
Všimněte si, ze výsledný graf je na ose 'x' číslován od 0 do 100, neboť to je velikost pole 'y'. Další možností je na zobrazit funkci sinus společně s osou 'x' definovanou dle pole 'x':
plt.plot(x,y)
{{courses:b3b33alp:cviceni:graf2.png?300|}}
Popisky os:
plt.xlabel('osa x')
plt.ylabel('osa y')
Samostatné úsečky: je třeba zadat pole počátečních x-ových a y-ových souřadnic.
plt.plot([x1,x2],[y1,y2],'k-');
Uložení obrázků do souboru: příkaz: [[ http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig | savefig ]]. Pro současné ulozeni obrázků do souboru a zobrazení je třeba volat ''savefig'' před příkazem ''show''.
plt.savefig('jmeno.png')
Kreslení historgramu - příkaz [[ http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist | hist ]]
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
size = 10000
y = np.random.randn(size)
n, bins, patches = plt.hist(y, 50, normed=0, alpha=0.74)
plt.savefig('histogram1.png', dpi=600)
plt.show()
{{courses:b3b33alp:cviceni:histogram1.png?300|}}
Poznámka: meze grafu lze určit i ručně příkazem [[ http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axis | axis ]]
plt.axis([-5,5, 0, 0.5])
zobrazí graf na ose 'x' v rozsahu -5,5 a na ose 'y' v rozsahu 0 až 0.5.
==== Úkol 2: zobrazení histogramu ====
* Vygenerujte náhodná čísla z Gaussova rozdělení se střední hodnotou 5 a $\sigma=15$.
* Vygenerujte náhodná čísla z Gaussova rozdělení se střední hodnotou 0 a $\sigma=5$.
* Zobrazte příslušné histogramy do jednoho grafu
*
==== Kreslení fraktálů ====
Ukázky fraktálů. Příklad vykreslení Kochovy křivky.
{{courses:b3b33alp:cviceni:fractal_example.png?300}}
== Kresleni fraktalu ==
import numpy as np
import matplotlib.pyplot as plt
def drawBranch(x, y, length, angle):
s = 0.7
a1 = 0.15
a2 = -0.15
if (length < 0.3):
return
l2 = s*length
x1 = x + l2*np.cos(angle)
y1 = y + l2*np.sin(angle)
plt.plot([x,x1],[y,y1], 'k-')
drawBranch(x1,y1,l2, angle+a1)
drawBranch(x1,y1,l2, angle+a2)
drawBranch(5,0,6,1.57)
plt.show()
{{courses:b3b33alp:cviceni:fractal_example.png?300}}