← Přehled všech hodin

Náhoda — kostky, souboj a loot

Cíl hodiny: Děti umí použít náhodu, chápou rozdíl mezi rovnoměrnou a váženou náhodou a umí ji ve Streamlitu udržet stabilní.
Jak stránku používat: vpravo nahoře je tlačítko Prezentace — schová všechno kromě jednoho bloku a přepíná se šipkami. U ukázek a cvičení je kód vlevo editovatelný: uprav ho a klikni na Spustit (nebo Ctrl+Enter), výsledek se objeví vpravo. Běží to přímo v prohlížeči, bez instalace.

1. Část pro učitele

Blok 1Import — používáme cizí kód1. Část pro učitele

1.1 Import — používáme cizí kód

První setkání s knihovnou. Princip je jednoduchý:

Python má hromadu hotových nástrojů, které nemusíš psát sám. import znamená „přines si krabici s nářadím". Pak z ní bereš přes tečku.

Podívej se i na druhý zápis a rozdíl:

První je čitelnější — vidíš, odkud funkce je. Používej ho.

Blok 2Základní funkce z random1. Část pro učitele

1.2 Základní funkce z random

Pozor na výjimku: randint(1, 6) zahrnuje obě krajní hodnoty. To je jinak než range(1, 6), které šestku nezahrne. Tohle se snadno plete, tak si to dobře zapamatuj.

Blok 3Vážená náhoda pomocí choices1. Část pro učitele

1.3 Vážená náhoda pomocí choices

Toto je pro hru zásadní:

weights říká, jak často se má co objevit. Prsten má váhu 5 ze sta, takže padne asi v pěti procentech případů.

Pozor: choices vrací seznam, i když chceš jednu věc. Proto to [0] na konci.

Tohle je přesně mechanika „lootu" ze skutečných her a skvěle se hodí do her.

Blok 4Pravděpodobnost pomocí porovnání1. Část pro učitele

1.4 Pravděpodobnost pomocí porovnání

Nejjednodušší způsob, jak udělat „šanci na něco":

random.random() dá číslo mezi nulou a jedničkou. Když se ptáš, jestli je menší než 0,25, vyjde to zhruba ve čtvrtině případů.

Alternativa s celými čísly, která je názornější:

Blok 5KLÍČOVÝ PROBLÉM: náhoda a Streamlit1. Část pro učitele

1.5 KLÍČOVÝ PROBLÉM: náhoda a Streamlit

Tohle je důležité pochopit, jinak v tom bude zmatek.

Skript se spouští znovu při každé interakci. Takže se znovu hodí i kostkou. Když chceš hodit jednou a výsledek si nechat, musíš ho uložit do session_state.

Správné řešení:

Tohle je propojení hodiny 5 a 11 a ověříš si na něm, že si session_state pamatuje hodnoty.

Blok 6seed — náhoda, která se dá zopakovat1. Část pro učitele

1.6 seed — náhoda, která se dá zopakovat

Počítač neumí opravdovou náhodu. Počítá ji podle vzorce ze startovního čísla. Když startovní číslo (seed) nastavíš, dostaneš vždycky stejnou řadu. Používá se to na testování — chceš, aby se program choval pokaždé stejně.

To je hezký moment na otázku: „Je tohle opravdová náhoda?"

Blok 7Zákon velkých čísel — ukázka na datech1. Část pro učitele

1.7 Zákon velkých čísel — ukázka na datech

Skvělé propojení s matematikou:

Jeden hod nepředvídáš. Ale když hodíš tisíckrát, každé číslo padne asi stejně často. Tomu se říká zákon velkých čísel.

Měň počet hodů posuvníkem a sleduj, jak se sloupce vyrovnávají. Je to silný moment.

Blok 8Podtržítko jako proměnná1. Část pro učitele

1.8 Podtržítko jako proměnná

Podtržítko znamená „tuhle proměnnou nepotřebuju". Je to signál pro čtenáře kódu, ne pravidlo Pythonu.

Poznámky pro učiteleTechnické pozadí pro učitele1. Část pro učitele

1.9 Technické pozadí pro učitele

  • random používá Mersenne Twister — je to pseudonáhodný generátor, deterministický a pro kryptografii nevhodný. Na hry a výuku ideální.
  • Pro bezpečnostní účely existuje secrets, ale sem nepatří.
  • random.shuffle() míchá na místě a vrací None — stejná past jako list.sort().
  • Ve Streamlitu lze náhodu stabilizovat i pomocí @st.cache_data, ale session_state je pro děti pochopitelnější.
  • Pro C# programátora: random.randint(1,6) odpovídá Random.Next(1, 7) — Python zahrnuje horní mez, C# ne.
Poznámky pro učiteleČasté chyby1. Část pro učitele

1.10 Časté chyby

Chyba Příčina Řešení
Číslo se mění při každém kliku Náhoda mimo session_state Uložit do stavu
NameError: name 'random' is not defined Chybí import random Doplnit nahoře
choices vrací seznam Tak je navržený Přidat [0]
x = seznam.shuffle() je None Míchá na místě random.shuffle(seznam) bez přiřazení
randint(1,6) nikdy nedá 6? Dá — na rozdíl od range Vysvětlit rozdíl
ValueError: sample larger than population sample(s, 5) ze 3 prvků Kontrolovat len()


2. Ukázky pro projekci

Blok 9Ukázka 1 — Co všechno umí random2. Ukázky pro projekci
demo/demo1_random.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 10Ukázka 2 — Vážená náhoda a loot2. Ukázky pro projekci
demo/demo2_loot.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 11Ukázka 3 — Zákon velkých čísel2. Ukázky pro projekci
demo/demo3_velka_cisla.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

3. Cvičení na hodinu

Blok 12Cvičení 1 — Hod kostkou (15 min)3. Cvičení na hodinu

Zadání:

  1. Přidej import random úplně nahoru
  2. Ulož do session_state hodnotu hod s výchozí nulou
  3. Přidej tlačítko „🎲 Hodit", které nastaví hod na random.randint(1, 6)
  4. Zobraz výsledek velkým písmem a přidej emoji kostky podle hodnoty
  5. Přidej výběr počtu stěn kostky (6, 12, 20) a hoď podle něj
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4
Výzva Bod 5 + počítat, kolikrát padla šestka

Očekávaný výsledek: kostka, která se změní jen po kliknutí na tlačítko.

cviceni/cviceni1_kostka.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Na co si dát pozor
  • Ohlídej import random a rozsah randint(1, 6).
  • Výsledek hodu má být uložený do st.session_state, ne jen do lokální proměnné.
  • Pamatuj, že při každém kliku se Streamlit skript spouští znovu.
Řešení 1 — jedna z možných variant
reseni/reseni1_kostka.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 13Cvičení 2 — Náhodný generátor postavy (20 min)3. Cvičení na hodinu

Zadání:

  1. Vytvoř seznamy jmen, povolání a zbraní
  2. Tlačítkem „Vygenerovat hrdinu" vyber z každého seznamu náhodně přes random.choice
  3. Statistiky (síla, magie, obratnost) generuj přes random.randint(5, 20)
  4. Ulož vygenerovanou postavu do session_state a zobraz ji jako kartu
  5. Přidej vzácnost: 5% šance na legendární postavu s dvojnásobnými statistikami
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4
Výzva Bod 5 s random.random() < 0.05

Očekávaný výsledek: každé kliknutí vytvoří jiného hrdinu.

cviceni/cviceni2_generator.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Na co si dát pozor
  • U funkce generátoru ohlídej, že se opravdu vrací slovník s konzistentními klíči.
  • Pravděpodobnost legendární postavy je dobré psát jako porovnání random.random() < ....
  • Snadno zapomeneš po stisku tlačítka znovu vyrenderovat stránku (st.rerun).
Řešení 2 — jedna z možných variant
reseni/reseni2_generator.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 14Cvičení 3 — Souboj s náhodou (20 min)3. Cvičení na hodinu

Zadání:

  1. Nastav životy hrdiny a příšery do session_state
  2. Tlačítko „Zaútoč" hodí kostkou a poškození je sila + hod
  3. Příšera zaútočí zpět svým vlastním hodem
  4. Přidej 15% šanci na kritický zásah, který poškození zdvojnásobí
  5. Zapiš každé kolo do logu a vyhodnoť konec souboje
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4
Výzva Bod 5 + 10% šance na úplné minutí

Očekávaný výsledek: souboj, jehož výsledek se pokaždé liší.

cviceni/cviceni3_souboj_nahoda.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Na co si dát pozor
  • U souboje je potřeba jasně oddělit výpočet útoku a zápis do logu.
  • Pracuj s hranicemi přes max(0, ...), aby HP neklesly pod nulu.
  • Kritický zásah i minutí řešte explicitně, aby byl výstup čitelný.
Řešení 3 — jedna z možných variant
reseni/reseni3_souboj_nahoda.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 15Cvičení 4 — Truhla s vzácnou kořistí (20 min)3. Cvičení na hodinu

Zadání:

  1. Vytvoř seznam kořisti a seznam vah (například 50, 30, 12, 6, 2)
  2. Vypiš procentuální šanci každé položky
  3. Tlačítkem otevři truhlu pomocí random.choices(...)[0]
  4. Ukládej všechny nálezy do seznamu a spočítej, kolikrát co padlo
  5. Zobraz statistiku sloupcovým grafem a porovnej ji s očekáváním
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4
Výzva Bod 5 + tlačítko „Otevřít 100 truhel najednou"

Očekávaný výsledek: čím víc truhel, tím blíž je statistika zadaným vahám.

cviceni/cviceni4_truhla.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Na co si dát pozor
  • U vah v random.choices zkontroluj stejný počet položek a vah.
  • U choices počítej s tím, že vrací seznam; pro jednu hodnotu je potřeba [0].
  • Vést počitadla nálezů ve slovníku je praktičtější než ručně v mnoha proměnných.
Řešení 4 — jedna z možných variant
reseni/reseni4_truhla.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 16Cvičení 5 — PyQuest: nepředvídatelné dobrodružství (25 min)3. Cvičení na hodinu

Zadání:

  1. Výsledek výpravy nech rozhodnout kostkou: zivoty + hod > nebezpeci
  2. Odměnu udělej náhodnou v rozsahu randint(odmena // 2, odmena * 2)
  3. Kořist vybírej pomocí random.choices s vahami podle vzácnosti
  4. Přidej 10% šanci na náhodnou událost (past, nález, léčivý pramen)
  5. Zapiš do deníku, co se přesně stalo, včetně hodu kostkou
Úroveň Co má zvládnout
Minimum Body 1–2
Rozšíření Body 3–4
Výzva Bod 5 + náhodná příšera z bestiáře při každé výpravě

Očekávaný výsledek: hra, kterou se vyplatí hrát vícekrát.

cviceni/cviceni5_pyquest_nahoda.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Na co si dát pozor
  • V PyQuestu ohlídej, aby náhoda neporušila základní pravidla hry (HP a zlato pod nulou).
  • Deník má zaznamenat i hod kostkou a typ výsledku výpravy.
  • Náhodné události je lepší implementovat až po stabilním základním průchodu.
Řešení 5 — jedna z možných variant
reseni/reseni5_pyquest_nahoda.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

4. Domácí úkol

Blok 17Domácí úkol na příští hodinu4. Domácí úkol

Přidej do hry hazardní hru v hospodě: hrdina vsadí zlato, hodí se dvěma kostkami a když je součet 7 nebo víc, vyhraje dvojnásobek. Jinak sázku ztratí. Spočítej po dvaceti hrách, jestli je hra pro hráče výhodná, nebo ne.

Zobrazit ukázkové řešení domácího úkolu

Toto je jedna z možných variant, jak mohl úkol dopadnout. Tvoje řešení se může lišit a to je v pořádku.

domaci/domaci_ukol11.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 18Oficiální dokumentace4. Domácí úkol

Oficiální dokumentace se hodí, když si chceš ověřit, jak přesně fungují funkce z modulu random, jaké mají parametry a jaké další varianty náhody Python nabízí. Je v angličtině, ale často stačí projít názvy funkcí, krátké ukázky a tabulku parametrů.

Co jsme použili Oficiální dokumentace Co tam najdeš
modul random random přehled funkcí pro náhodná čísla, výběr i míchání
random.randint random.randint náhodné celé číslo včetně obou krajních hodnot
random.random random.random desetinné číslo od 0.0 do 1.0
random.choice random.choice výběr jednoho náhodného prvku ze seznamu
random.choices random.choices vážený výběr a práce s parametrem weights
random.sample random.sample několik různých prvků bez opakování
random.shuffle random.shuffle zamíchání seznamu přímo na místě
random.seed random.seed nastavení startu pro zopakovatelnou pseudonáhodu
st.session_state st.session_state uložení hodu nebo lootu tak, aby se neměnil při každém kliku

5. Umíme informatiku

Blok 19Navazující cvičení na Umíme informatiku5. Umíme informatiku
Cvičení Odkaz Proč se hodí
Programování v Pythonu umimeinformatiku.cz Moduly a funkce
Rozhodovačka umimeinformatiku.cz Rychlé vyhodnocení
Logika a řešení problémů umimeinformatiku.cz Pravděpodobnostní úvahy
Tabulky umimeinformatiku.cz Statistika výsledků