IB111 Základy programování Fran šek Lachman lachmanfran sek@mail.muni.cz cvičení 4 9. říjen 2018 Osnova kontrolní otázky (pseudo)náhodná čísla simulace a nalýzy (debugging) první domácí úkol zadání druhé domácí úlohy Kontrolní otázky 3 Docházka 4 Jakým způsobem vygenerujeme náhodné číslo od 1 do 20 ? 5 import random random.randint(1,6) 6 Jakým způsovem vygenerujeme náhodné číslo v intervalu [0,1) ? 7 import random random.random() 8 Jak generovat vždy stejnou posloupnost "náhodných" čísel? 9 random.seed(42) print(random.random()) random.seed(42) print(random.random()) 10 Je u datové struktury seznam důležité pořadí prvků? 11 Může v Pythonu seznam obsahovat položky různého typu? 12 ["hello", 3] 13 Jakým příkazem přidáme do seznamu nový prvek? 14 my_list = [4,5] print(my_list) my_list.append(6) print(my_list) 15 Co znamená „indexování od nuly“? 16 Co znamená zápis alist[3:7]? 17 alist[3:7] 18 Proč není dobrý nápad dát proměnné obsahující seznam jméno list? 19 Řetězec je v mnoha ohledech podobný jako „seznam znaků“. V čem se liší? 20 my_list = ['a', 'b'] my_list.append('c') my_list[1] = 'c' print(my_list) my_string = "ab" my_string[1] = 'c' # error my_string = my_string + 'c' print(my_string) 21 Jaký je význam funkcí chr a ord? 22 print(ord('a')) print(chr(61)) 23 Jak zjis me délku seznamu? 24 print(len([])) print(len(['a', 'b'])) print(len("abcd")) 25 Jak vytvořit seznam obsahující čísla od 1 do 5? (uveďte několik různých způsobů) 26 pass 27 Jak zjis me poslední prvek seznamu? Zkuste najít 3 různé způsoby. 28 pass 29 Debugging (ladění kódu) Breakpoint IDLE (editor) -> pravé tlačítko -> Set Breakpoint/Clear Breakpoint Spuštění debuggeru IDLE (shell) -> Debug -> Debugger Zobrazení stavu proměnných, spouštění kódu po krocích, k následujícímu Breakpointu. 30 4.1. Hrátky s náhodnos 4.1.1. Šestiboká kostka Napište funkci dice , která bude vracet nově vygenerované náhodné číslo simulující šestistěnnou kostku s čísly 1 - 6 . def dice(): return random.randint(1,6) 31 4.1.2. Dokud padá sudé číslo Napište funkci turn , která bude provádět házení obyčejnou šestistěnnou kostkou tak dlouho dokud nepadne liché číslo. Poté funkce vrátí celkový součet všech hozených hodů. def turn(): throw = dice() result = throw # print("throw: " + str(throw)) while throw % 2 == 0: throw = dice() # print("throw: " + str(throw)) result += throw return result 32 4.1. Hrátky s náhodnos 4.1.4. Frekvence kostky Napište funkci dice_freq , která provede count hodů obyčejnou šestibokou kostkou a následně vypíše kolikrát které číslo padlo. Tip: pro ukládání frekvencí se mohou hodit seznamy z následující kapitoly či nějaká jiná datová struktura. def dice_freq(count): numbers = [0,0,0,0,0,0] for _ in range(count): throw = dice() numbers[throw -1] += 1 33 4.2. Simulace a analýzy 4.2.1. Opilec na cestě domů Opilec je na půli cesty mezi domovem a hospodou, každý krok udělá náhodně jedním směrem. Napište funkci drunkman_simulator , která bude simulovat opilcův pohyb. Jejímy parametry budou vzdálenost mezi domovem a hospodou a počet kroků do opilcova usnutí (tj. maximální délka simulace). Simulace skončí buď tehdy, když opilec dojede domů nebo do hospody, případně po vyčerpání počtu kroků. 34 >>> drunkman_simulator(10, 100) home . . . . . * . . . . pub home . . . . * . . . . . pub home . . . * . . . . . . pub home . . . . * . . . . . pub home . . . . . * . . . . pub home . . . . * . . . . . pub home . . . . . * . . . . pub home . . . . . . * . . . pub home . . . . . * . . . . pub home . . . . . . * . . . pub home . . . . . . . * . . pub home . . . . . . . . * . pub home . . . . . . . . . * pub home . . . . . . . . * . pub home . . . . . . . . . * pub home . . . . . . . . . . pub Ended in the pub again! 35 from random import randint, random def print_path(size, position): print("home", end=" ") for i in range(size): if i == position: print("*", end=" ") else: print(".", end=" ") print("pub") 36 def drunkman_simulator(size, steps, output=False): if size < 3: print("Path too short") return position = int((size - 1) / 2) if output: print_path(size, position) for _ in range(steps): direction = randint(1,2) if direction == 1: position += 1 else: position -= 1 if output: print_path(size, position) if position == size - 1: if output: print("Ended in the pub again!") return False elif position == 0: if output: print("Got home!") return True 37 4.2. Simulace a analýzy 4.2.2. Analýza opilce Nejprve upravte funkci drunkman_simulator z předchozí příkladu tak, aby nevypisovala stav opilce (například přidáním volitelného parametru output a zapodmínkováním výpisu) a aby vracela True dojde-li opilec domů a False pokud ne. Následně napište funkci drunkman_analysis , která provede simulaci opilce count krát a vypíše procentuální úspěšnost dojití domů. 38 def drunkman_analysis(size, steps, count): times_home = 0 for _ in range(count): if drunkman_simulator(size, steps): times_home += 1 print("Arriving home in", float(times_home) * 100/count , 39 4.2. Simulace a analýzy 4.2.6. Tipující student Napište funkci random_student , která experimentálně zjistí (pro count pokusů) jaká je pravděpodobnost, že student natipuje alespoň polovinu n otázkového testu, ve kterém každá otázka má právě 4 možnosti a právě jedna z nich je správně. 40 def random_student(n, count): correct_tests = 0 for _ in range(count): correct_questions = 0 for _ in range(n): # Go through test correct = randint(1,4) chosen = randint(1,4) if correct == chosen: correct_questions += 1 if correct_questions > n/2: correct_tests += 1 print("Probability of quessing at least 50 % of test is" 41 Galerie hadů 42 43 44 45 46 47 48 49 50 51 52 53 54 55 2017 56 Osnova kontrolní otázky (pseudo)náhodná čísla simulace a nalýzy (debugging) první domácí úkol zadání druhé domácí úlohy