IB111 Základy programování František Lachman lachmanfrantisek@mail.muni.cz cvičení 4 11. říjen 2017 Osnova kontrolní otázky (pseudo)náhodná čísla hrátky s náhodností simulace a nalýzy (debugging) galerie hadů zadání druhé domácí úlohy Kontrolní otázky Jakým způsobem vygenerujeme náhodné číslo od 1 do 20 ? Jakým způsovem vygenerujeme náhodné číslo v intervalu [0,1) ? Jak generovat vždy stejnou posloupnost "náhodných" čísel? 3 Import # z knihovny math importujeme funkci sqrt (odmocnina) # a konstantu pi from math import sqrt, pi print(sqrt(4)) print(pi) Případně import modulu: # importujeme modul math import math # k clenum se odkazujeme pomoci "teckove notace" print(math.sqrt(4)) print(math.pi) 4 (Pseudo)náhodná čísla from random import random, randint print(randint(1, 10)) print(random()) 5 0.867052827359 6 0.242054727754 4 0.997004615803 5 Deterministické generování pseudonáhodných čísel from random import random, seed seed(42) print(random()) 0.374540118847 0.374540118847 0.374540118847 6 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. 7 4.1. Hrátky s náhodností 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 . 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ů. 8 4.1. Hrátky s náhodností 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. 9 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ů. 10 >>> 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! 11 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ů. 12 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ě. 13 Galerie hadů 14 Druhá domácí úloha Deadline: 20. 10. 2017 23:59 Odevzdání do odevzdávárny v ISe: Skupina 20 [Lachman]/Domácí úkol 2 Jeden soubor UČO.py s hlavičkou: """ uco: 123456 jmeno: Jméno Příjmení hw: 2 """ 31 Druhá domácí úloha Úkol 1: Vytvořte simulátor zjednodušené hry "Člověče nezlob se". Hraje se na hracím plánu o n polích. Figurka začíná na jedné straně hracího plánu. Háže se kostkou ( 1 - 6 ), když padne 6 , hází se znovu. Pokud padne lichý počet šestek, gurka zůstává stát. Figurka se posunuje o součet hodnot z kostek, zůstává stát ocitla-li by se za cílem. Hra končí když gurka dorazí na poslední pole. 32 Druhá domácí úloha Poznámky: Při délce hracího plánu < 1 skončete funkci a vypište nějakou smysluplnou hlášku. Figurka se posunuje buď o celkový součet hodů na kostkách, nebo vůbec (v situacích, kdy by přešla domeček, nebo padl lichý počet šestek). 33 Druhá domácí úloha Ukázkový výpis programu (mezi závorkami je mezera): >>> board_game(16) ( )(X)( )( )( )( )( )( )( )( )( )( )( )( )( )( ) [1] ( )(X)( )( )( )( )( )( )( )( )( )( )( )( )( )( ) [6][6][6][2] ( )( )( )( )( )( )( )( )( )( )( )( )( )( )(X)( ) [6][6][1] ( )( )( )( )( )( )( )( )( )( )( )( )( )( )(X)( ) [5] ( )( )( )( )( )( )( )( )( )( )( )( )( )( )( )(X) [1] The game ended in round 5. 34 Druhá domácí úloha Vytvětlení předchozího příkladu: Začínáme na prvním poli. 1. Padlo 1 , posun o jedno místo. 2. Padl lichý počet 6 a 2 , stojím na místě. 3. Padl sudý počet 6 a 1 , posun o 13 polí. 4. Padlo 5 , přeskočili bychom cíl (poslední pole), zůstáváme stát. 5. Padlo 1 , skočíme na poslední pole 35 Druhá domácí úloha Úkol 2: Vytvořte funkci game_analysis , který analyzuje jaká je průměrná délka (vrátí typ float ) hry pro zadaný počet polí a počet her. 36 Druhá domácí úloha Úkol 3: Vytvořte funkci game_average_length , která pomocí funkce game_analysis z úkolu 2 zjistí průměrné délky her pro plány o velikostech 1-50 (do řešení přiložte/zkopírujte výpis). 37 Druhá domácí úloha Kostra from random import randint, random def board_game(length, output = True): pass def game_analysis(length, count): pass def game_average_length(count): pass 38 Druhá domácí úloha rozumné množství rozumných komentářů vhodné členění kódu na funkce bez zbytečných výpisů správné názvy funkcí úprava kódu: pycodestyle (PEP8) pylint (přísnější než PEP8, ale lehce přehlednější výstup) 39