Table of Contents

Cvičení 12: Náhodná čísla, grafický výstup

Quick Testy

V průběhu týdne se zde objeví zadání pro Quick Test Q1 a Q2. Tyto testy nejsou povinné, slouží hlavně jako trénink ke zkoušce. Doporučujeme všem si quick test vyzkoušet, necháváme na Vás, kdy si test zkusíte. Vyčleňte si na test alespoň 1 hodinu a změřte si, jak dlouho Vám bude trvat odevzdat funkční program. Optimálně byste měli quick test vyřešit do 30 minut. Ten kdo nevyřeší quick test ani do 1.5 hodiny tak by zkouškou z ALP neprošel a měl by si zkusit vyřešit před zkouškou ještě více příkladů.

Quick test QT2

slovnik.txt

Genealogie

class Person:
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex   
        self.children = []  
        self.parents = []   # parents of this node
        self.partner = None   # partner (=husband/wife of this node)
 
    def add_child(self, node):
        self.children.append(node)
 
    def add_parent(self, node):
        self.parents.append(node)
 
    def set_partner(self, node):
        self.partner = node
 
    def __str__(self):
        s = "Female" if self.sex == 'F' else "Male" 
        return self.name + " " + s

Vstupní soubor family.txt:

M Jana Jan F M
P Jana Martin F M
P Jana Robert F M
P Robert Gabriel M M
P Robert Oleg M M
P Robert Ondrej M M
P Martin Jiri M M
P Martin Rudolf M M
P Jan Petra M F
P Jan Uxana M F
P Uxana Klara  F F
P Uxana Jakub F M
P Uxana Adam F M
P Petra Alex F M
P A C M M
P A D M F
P D K F F
P C J M M 
P C I M F
P C H M M
P B E F F
P B F F M 
P B G F F

Schéma rodiny ve family.txt:

Generování (pseudo)náhodných čísel

Princip LCG

Generování náhodných čísel v Pythonu

import random
 
for i in range(10):
   print(random.random())

import random
 
for i in range(10):
   print(random.randint(-10,10))

Vytváření jednoduché grafiky

Hlavním objektem je plt z modulu matplotlib.pyplot, který poskytuje spoustu metod ke kreslení různých funkcí.

import numpy as np
import matplotlib.pyplot as plt
 
x = np.arange(0.,10.,0.1)
y = np.sin(x)
plt.plot(y)
plt.show()

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)

A pomocí volání funkcí 'x/ylabel' nastavíme popisky jednotlivých 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: 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í histogramu - příkaz hist

import numpy as np
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()

Poznámka: meze grafu lze určit i ručně příkazem 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 4: zobrazení histogramu

Kreslení fraktálů

import numpy as np
import matplotlib.pyplot as plt
 
def drawBranch(x, y, length, angle):
 
    # Konec rekurze
    if (length < 0.3):
        return
 
    a1 = 0.15
    a2 = -0.15
 
    s = 0.7
    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)
 
if __name__ == '__main__':
 
    drawBranch(5,0,6,1.57)
    plt.show()