randint, choice, choices, shuffle, sample, seed, pravděpodobnostPrvní setkání s knihovnou. Princip je jednoduchý:
Python má hromadu hotových nástrojů, které nemusíš psát sám.
importznamená „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.
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.
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:
choicesvrací 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.
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ší:
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.
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?"
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.
Podtržítko znamená „tuhle proměnnou nepotřebuju". Je to signál pro čtenáře kódu, ne pravidlo Pythonu.
random používá Mersenne Twister — je to pseudonáhodný generátor,
deterministický a pro kryptografii nevhodný. Na hry a výuku ideální.secrets, ale sem nepatří.random.shuffle() míchá na místě a vrací None — stejná past jako list.sort().@st.cache_data, ale
session_state je pro děti pochopitelnější.random.randint(1,6) odpovídá Random.Next(1, 7) —
Python zahrnuje horní mez, C# ne.| 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() |
Zadání:
- Přidej
import randomúplně nahoru- Ulož do
session_statehodnotuhods výchozí nulou- Přidej tlačítko „🎲 Hodit", které nastaví
hodnarandom.randint(1, 6)- Zobraz výsledek velkým písmem a přidej emoji kostky podle hodnoty
- 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.
import random a rozsah randint(1, 6).st.session_state, ne jen do lokální proměnné.Zadání:
- Vytvoř seznamy jmen, povolání a zbraní
- Tlačítkem „Vygenerovat hrdinu" vyber z každého seznamu náhodně přes
random.choice- Statistiky (síla, magie, obratnost) generuj přes
random.randint(5, 20)- Ulož vygenerovanou postavu do
session_statea zobraz ji jako kartu- 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.
random.random() < ....st.rerun).Zadání:
- Nastav životy hrdiny a příšery do
session_state- Tlačítko „Zaútoč" hodí kostkou a poškození je
sila + hod- Příšera zaútočí zpět svým vlastním hodem
- Přidej 15% šanci na kritický zásah, který poškození zdvojnásobí
- 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ší.
max(0, ...), aby HP neklesly pod nulu.Zadání:
- Vytvoř seznam kořisti a seznam vah (například 50, 30, 12, 6, 2)
- Vypiš procentuální šanci každé položky
- Tlačítkem otevři truhlu pomocí
random.choices(...)[0]- Ukládej všechny nálezy do seznamu a spočítej, kolikrát co padlo
- 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.
random.choices zkontroluj stejný počet položek a vah.choices počítej s tím, že vrací seznam; pro jednu hodnotu je potřeba [0].Zadání:
- Výsledek výpravy nech rozhodnout kostkou:
zivoty + hod > nebezpeci- Odměnu udělej náhodnou v rozsahu
randint(odmena // 2, odmena * 2)- Kořist vybírej pomocí
random.choicess vahami podle vzácnosti- Přidej 10% šanci na náhodnou událost (past, nález, léčivý pramen)
- 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.
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.
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.
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 |
| 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ů |