← Přehled všech hodin

Náhoda

Cíl hodiny: Děti dostanou do hry nepředvídatelnost. Odcházejí s programem, který hází kostkou, generuje náhodného hrdinu a rozdává kořist podle pravděpodobnosti.
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). Program se přeloží a spustí přímo v prohlížeči a vpravo se objeví to, co vypsal do konzole. Nic se neinstaluje.
Kde jsme a co dnes přibude: Náhoda je poslední dílek. Od téhle hodiny už jen stavíš.

1. Vysvětlení a souvislosti

Poznámky pro učiteleJak celou hodinu vést1. Vysvětlení a souvislosti

Tenhle blok je jen pro vás — dětem ho nepromítejte.

Fáze Co se děje Čas
Rozjezd Spustíte starou hru dvakrát a ukážete, že je identická 10 min
Výklad + ukázky Bloky 2–8, postupně Next → rozsahy → NextDouble → seed 40 min
Ukázky pro projekci Pět hotových programů, píšete je živě 20 min
Cvičení Děti pracují samy, vy obcházíte 60 min
Závěr Kdo chce, pustí svoji výpravu dvakrát za sebou 10 min
Hlavní pedagogický cíl

Dnešek je pedagogicky nejvděčnější hodina kurzu. Děti okamžitě vidí, že program dělá pokaždé něco jiného, a začnou spouštět znovu a znovu. Nechte je. Opakované spouštění je přesně to, co potřebují, aby pochopily pojem pravděpodobnosti.

Druhý cíl je horní mez Next(min, max) je vyloučená. Tohle je jediná skutečně zrádná věc dnešní hodiny. Napište to na tabuli a nechte to tam do konce hodiny.

Tři věci, které dnes NEVYSVĚTLUJTE
  1. Že náhoda není opravdová náhoda. Slovo „pseudonáhodný" zmiňte jednou v ukázce se seedem a dál to nerozvádějte. Podrobnosti jsou v učitelském bloku na konci.
  2. Random.Shared. Existuje a je lepší, ale new Random() je názornější a odpovídá všem návodům, které děti najdou na internetu.
  3. Rovnoměrné rozdělení, statistiku a testy náhodnosti. Stačí „každé číslo má stejnou šanci" a hotovo.

Jedna kostka na celý program. Trvejte na tom, aby Random vznikl jednou, nahoře, a pak se jen používal. Když si ho někdo vyrobí uvnitř cyklu, dostane v nových verzích .NET sice různá čísla, ale je to špatný návyk — a ve starších verzích to dávalo pořád totéž.

Jak pracovat se smíšenou úrovní. Minimum je hod kostkou v cyklu. Rozšíření je NextDouble a procenta. Výzva je vážená kořist, kde se pravděpodobnosti sčítají.

Blok 1Problém, který náhoda řeší1. Vysvětlení a souvislosti

Spusť to dvakrát. Vyjde to úplně stejně. A potřetí taky.

To je u výpočtu skvělé — kalkulačka musí být předvídatelná. Ale u hry je to smrt. Hra, která se pokaždé odehraje identicky, není hra. Je to film.

Co chceme: - útok za 5 až 12, ne pořád za 7, - skřeta, který má někdy 24 a někdy 38 životů, - truhlu, ve které občas je něco vzácného.

Potřebujeme kostku.

Klikni vlevo na Spustit a objeví se tu výstup programu.

Spusť to několikrát za sebou. Pokaždé jiná čísla.

Random je generátor náhodných čísel. Představ si ho jako kostku, kterou si vyrobíš a pak s ní můžeš házet, kolikrát chceš.

Dva řádky, které si musíš zapamatovat:

  • Random kostka = new Random(); — vyrob kostku. Jednou, nahoře.
  • kostka.Next(1, 7) — hoď si. Dá číslo od 1 do 6.

Jméno kostka je jen proměnná — může se jmenovat jakkoliv. V cizím kódu uvidíš rnd, random nebo rng.

A teď ta nejdůležitější věta dnešní hodiny…

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 2Pozor: horní mez se nepočítá1. Vysvětlení a souvislosti

Next(min, max) nikdy nevrátí max. Horní mez je vyloučená.

Proto je u šestistěnné kostky Next(1, 7) a ne Next(1, 6). Sedmička nikdy nepadne, šestka ano.

Zapamatovací pomůcka: „do, ale ne včetně."

Tři varianty, které existují:

Zápis Co vrátí
kostka.Next() ohromné číslo, nepoužitelné pro hru
kostka.Next(10) 0 až 9
kostka.Next(1, 7) 1 až 6

Spusť to párkrát a zkontroluj: vidíš někde sedmičku? A desítku?

Vzorec, který si zapiš: chceš čísla od a do b včetně? Napiš kostka.Next(a, b + 1).

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 3Desetinná náhoda a procenta1. Vysvětlení a souvislosti

NextDouble() vrátí desetinné číslo od 0 do 1 (jedničku nikdy).

Samo o sobě to k ničemu není. Síla je v porovnání:

if (kostka.NextDouble() < 0.3) znamená „ve třiceti procentech případů".

Proč to funguje? Čísla jsou rozhozená rovnoměrně mezi 0 a 1, takže právě 30 % z nich je menších než 0,3.

Podmínka Šance
< 0.05 5 %
< 0.3 30 %
< 0.5 50 %
< 0.95 95 %

Spusť to několikrát. Někdy padnou dva kritické zásahy za sebou, někdy žádný — a to je v pořádku. Třicet procent neznamená „každý třetí".

Totéž jde i celými čísly: if (kostka.Next(100) < 30). Vyber si jeden způsob a drž se ho.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 4Náhodný výběr z pole1. Vysvětlení a souvislosti

Nejpoužitelnější trik dnešní hodiny. Náhodný prvek pole se vybere takhle:

pole[kostka.Next(pole.Length)]

Přečti to zevnitř ven:

  1. pole.Length je počet prvků, třeba 5.
  2. kostka.Next(5) dá 0, 1, 2, 3 nebo 4.
  3. To jsou přesně všechny platné indexy pole.

Všimni si, že se skvěle hodí ta vyloučená horní mez. Kdyby Next(5) mohlo vrátit pětku, spadlo by to na IndexOutOfRangeException. Takhle to sedí přesně.

A nemusíš nic měnit, když do pole přidáš šestou příšeru. Length se postará sám.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 5Seed: náhoda, která se opakuje1. Vysvětlení a souvislosti

Obě řady jsou stejné. A budou stejné i zítra.

Když Random dostane do závorek číslo, říká se mu seed (semínko). Ze stejného semínka vyroste stejná řada čísel.

Zápis Chování
new Random() pokaždé jiná čísla
new Random(42) pořád stejná čísla

K čemu to je?

  • Na testování. Když hra spadne, chceš tu samou situaci zopakovat.
  • Na férovost. Všichni hráči dostanou stejnou mapu.
  • Ve hrách jako Minecraft je seed číslo světa. Stejný seed = stejný svět.

Zkus přepsat 42 na jiné číslo. Řada se změní — ale bude zase pořád stejná.

Ve hře chceš skoro vždycky new Random() bez čísla.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 6Vzácná kořist: jak rozdělit šance1. Vysvětlení a souvislosti

Tohle je vzor, na kterém stojí každá hra s kořistí.

Hodíš jedno číslo od 0 do 99 a podle toho, do jakého pásma spadne, vybereš odměnu:

Pásmo Šance Co padne
0–4 5 % vzácný meč
5–19 15 % lektvar
20–59 40 % mince
60–99 40 % nic

Klíčová věc: podmínky musí jít od nejmenší po největší a else if zajistí, že platí jen ta první.

Nejčastější chyba je hodit si pro každou možnost zvlášť:

if (kostka.Next(100) < 5) …
if (kostka.Next(100) < 20) …

Pak můžeš dostat dvě odměny naráz. Hoď jednou a rozhoduj z jednoho čísla.

Spusť to párkrát. Meč nepadne skoro nikdy — a přesně o to jde.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Poznámky pro učiteleTechnické pozadí — jen pro vás1. Vysvětlení a souvislosti

Věci, které dětem dnes neříkejte, ale vy je vědět potřebujete.

Není to opravdová náhoda. System.Random je pseudonáhodný generátor — deterministický algoritmus, který z vnitřního stavu počítá další číslo a stav aktualizuje. Ze stejného počátečního stavu (seed) vyjde vždycky stejná řada. Skutečnou náhodu počítač bez speciálního hardwaru nevyrobí. Dětem stačí věta ze seedové ukázky.

Bezseedový konstruktor. new Random() si seed bere z vnitřního zdroje. V .NET Frameworku to byly systémové hodiny, takže dva generátory vytvořené v rychlém sledu daly identickou řadu — odtud staré rady „vytvářej Random jen jednou". Od .NET 6 je to opravené (thread-static seedování), ale pravidlo „jedna instance nahoře" platí dál, protože je to čistší kód.

Random.Shared. Od .NET 6 existuje Random.Shared.Next(1, 7) — sdílená, vláknově bezpečná instance, kterou nemusíte vytvářet. V produkčním kódu je to správná volba. Ve výuce používáme new Random(), protože dítě vidí, že si generátor vyrobilo — a protože to najde ve všech návodech na internetu.

Nepoužívejte na bezpečnost. Random se nesmí používat na hesla, tokeny ani na cokoliv, co má být neuhodnutelné. Na to je System.Security.Cryptography.RandomNumberGenerator. Zmiňte to jen tehdy, kdyby někdo chtěl generovat heslo.

NextDouble() vrací [0, 1) — nula může padnout, jednička nikdy. Next(a, b) vrací [a, b). Je to konzistentní a stojí za to na to upozornit: v C# (a ve většině jazyků) je horní mez skoro vždycky vyloučená.

Next(int) s záporným argumentem hodí ArgumentOutOfRangeException. Stejně tak Next(10, 5), kde je minimum větší než maximum. Obojí děti občas vyrobí prohozením argumentů.

Statistika hodů. Ukázka 2 kombinuje dnešní téma se slovníkem z 8. hodiny a cyklem z 9. Při 6000 hodech vychází každé číslo kolem 1000×, ale nikdy přesně — to je dobrá příležitost mluvit o tom, že „spravedlivá kostka" neznamená „rovnoměrné výsledky v malém vzorku".

Živé spouštění. Všechno z dnešní hodiny běží v prohlížeči. Náhoda je čistý výpočet, žádné soubory ani síť.

2. Ukázky pro projekci

Blok 7Ukázka 1 — Kostka2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň kostku na dvacetistěnnou (Next(1, 21)).
  • Přidej druhou kostku a sečti hody.
  • Zkus Next(1, 6) — kolikrát padne šestka?
  • Nahraď new Random() za new Random(7) a spusť dvakrát.
demo/demo1_kostka.cs
Tady se objeví výstupKlikni 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.

Co si z toho odnést: Random se vyrábí jednou nahoře, Next(1, 7) dává šestistěnnou kostku a horní mez se nepočítá.

Blok 8Ukázka 2 — Je ta kostka poctivá?2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň počet hodů z 6000 na 60 a pak na 600.
  • Přidej výpis, kolikrát padlo sudé číslo.
  • Zkus dvacetistěnnou kostku.
  • Použij new Random(1) — vyjde to pokaždé stejně?
demo/demo2_statistika_hodu.cs
Tady se objeví výstupKlikni 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.

Co si z toho odnést: náhoda je „spravedlivá" až ve velkém počtu pokusů. Při šesti hodech může šestka padnout třikrát, při šesti tisících už ne.

Blok 9Ukázka 3 — Generátor hrdiny2. Ukázky pro projekci
Studenti zkuste změnit
  • Přidej do polí vlastní jména a povolání.
  • Změň rozsah životů na 40 až 80.
  • Přidej vlastnost „štěstí" od 1 do 10.
  • Vygeneruj pět hrdinů v cyklu a vyber nejsilnějšího.
demo/demo3_nahodny_hrdina.cs
Tady se objeví výstupKlikni 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.

Co si z toho odnést: pole[kostka.Next(pole.Length)] je náhodný prvek pole. Spusť to pětkrát a pokaždé máš jiného hrdinu.

Blok 10Ukázka 4 — Truhly a vzácná kořist2. Ukázky pro projekci
Studenti zkuste změnit
  • Zvyš šanci na meč z 5 % na 30 % a sleduj rozdíl.
  • Přidej pátou kategorii kořisti.
  • Změň počet truhel na 50.
  • Vyzkoušej NextDouble() < 0.05 místo Next(100) < 5.
demo/demo4_koristi.cs
Tady se objeví výstupKlikni 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.

Co si z toho odnést: hoď jedno číslo a rozděl ho do pásem přes else if. Kdybys házel pro každou odměnu zvlášť, mohl bys dostat všechno naráz.

Blok 11Ukázka 5 — Nepředvídatelná výprava2. Ukázky pro projekci
Studenti zkuste změnit
  • Spusť to třikrát. Kolikrát hrdina přežil?
  • Zvyš rozsah útoku z 5–12 na 8–16.
  • Přidej metodě Souboj šanci na kritický zásah.
  • Změň new Random() na new Random(2026) — teď je výprava pokaždé stejná.
demo/demo5_vyprava.cs
Tady se objeví výstupKlikni 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.

Co si z toho odnést: tohle už je hra. Náhoda je ve výběru příšery, v jejích životech, v každém útoku, v kritických zásazích i v odměně — a spuštění se nikdy neopakuje.

Blok 12Když se něco pokazí2. Ukázky pro projekci
Unhandled exception. System.ArgumentOutOfRangeException:
'minValue' cannot be greater than maxValue. (Parameter 'minValue')

Prohozené argumenty. Někdo napsal kostka.Next(10, 1) místo Next(1, 10).

Pořadí je vždycky od, do: nejdřív nejmenší, pak horní mez.

Druhá varianta téhle chyby je kostka.Next(-5) — záporný počet možností nedává smysl a program spadne stejně.

A do třetice chyba, která nespadne, ale tiše kazí hru: kostka.Next(1, 6) u šestistěnné kostky. Šestka nepadne nikdy a nikdo si toho několik hodin nevšimne.

Kontrola, kterou dělej vždycky: spusť to patnáctkrát a podívej se, jestli padají obě krajní hodnoty.

Hláška Co to znamená Jak to opravit
ArgumentOutOfRangeException: 'minValue' cannot be greater than maxValue prohozené argumenty Next(1, 7), ne Next(7, 1)
IndexOutOfRangeException pole[kostka.Next(pole.Length + 1)] Next(pole.Length) bez plusu
horní hodnota nikdy nepadne horní mez je vyloučená chceš 1–6? napiš Next(1, 7)
program dává pokaždé stejná čísla použil jsi seed new Random() bez čísla v závorkách
CS0029: Cannot implicitly convert type 'double' to 'int' ukládáš NextDouble() do int proměnná musí být double
CS0117: 'Random' does not contain a definition for 'next' malé písmeno metody se píšou velkým: Next, NextDouble
padne víc odměn naráz házíš pro každou možnost zvlášť hoď jednou a rozhoduj přes else if
CS0165: Use of unassigned local variable proměnná se nastavuje jen v některých větvích přidej větev else, která ji nastaví taky

3. Cvičení

Jak cvičení používat: zadání promítněte. Části Pro učitele a Řešení jsou schované — rozbalí se až kliknutím, takže je můžete mít otevřené a děti je neuvidí, dokud nechcete. Kód ve cvičení i v řešení jde spustit a upravovat přímo tady v prohlížeči.
Blok 13Cvičení 1 — Kostka (15 min)3. Cvičení

Tvoje zadání:

Než přidáš náhodu do hry, musíš si osahat kostku. Hodíš si, spočítáš a ověříš, jestli je poctivá.

  1. Vyrob Random, hoď si jednou kostkou 1–6 a hod vypiš.
    💡 Poradit
    Random kostka = new Random(); a pak kostka.Next(1, 7).
    Horní mez se nepočítá — proto sedmička.
  2. Hoď desetkrát v cyklu a ke každému hodu vypiš tečky.
    💡 Poradit
    Cyklus for (int i = 1; i <= 10; i++).
    Tečky: new string('●', hod).
  3. Hoď dvěma kostkami, vypiš součet a poznamenej, jestli padl dublet.
    💡 Poradit
    Dva hody do dvou proměnných a pak if (a == b).
  4. Spočítej ve stovce hodů, kolikrát padla šestka.
    💡 Poradit
    Před cyklem int sestek = 0;, uvnitř if (hod == 6) { sestek++; }.
  5. Přidej dvacetistěnnou kostku a vyhodnoť kritický úspěch a neúspěch.
    💡 Poradit
    Dvacetistěnka je kostka.Next(1, 21).
    20 = kritický úspěch, 1 = kritický neúspěch.
Úroveň Co má zvládnout
Minimum vyrobit Random a hodit si v cyklu (kroky 1–2)
Rozšíření dvě kostky a počítadlo šestek (kroky 3–4)
Výzva jiný rozsah kostky a vyhodnocení krajních hodů (krok 5)
cviceni/cviceni1_kostka.cs
Tady se objeví výstupKlikni 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.
Pro učitele — na co si dát pozor

Očekávaný výsledek: pokaždé jiná čísla. Šestka padne ve stovce hodů obvykle 10–25×. Kritický úspěch v šesti hodech dvacetistěnkou většinou nepadne.

Kde se zaseknou: - Napíšou Next(1, 6) a diví se, proč nikdy nepadne šestka. Tohle bude v každé třídě — proto to máte na tabuli. - Vyrobí new Random() uvnitř cyklu. Dnes už to většinou funguje, ale trvejte na jedné kostce nahoře. - Napíšou kostka.next(1, 7) malým písmenem → CS0117. - Zapomenou, že Random vrací int, a zkusí ho uložit do string.

Kdo je hotový dřív: ať spočítá, kolikrát padl dublet ve stovce pokusů, ať udělá kostku, která nikdy nedá stejné číslo dvakrát za sebou, nebo ať zjistí průměr ze stovky hodů (měl by vyjít kolem 3,5).

Otázka na závěr: „Kolik má být šestek ve stovce hodů?" Zhruba 17. Ale skoro nikdy přesně — a to je celá podstata náhody.

Řešení 1 — jedna z možných variant
reseni/reseni1_kostka.cs
Tady se objeví výstupKlikni 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í 2 — Generátor hrdiny (20 min)3. Cvičení

Tvoje zadání:

Každé spuštění vyrobí jinou postavu. Jméno, povolání i statistiky vybere kostka.

  1. Vyber náhodné jméno z pole jmena.
    💡 Poradit
    Vzor je jmena[kostka.Next(jmena.Length)].
    Uvnitř Next je jen jedno číslo — délka pole.
  2. Přidej náhodné povolání a domov ze dvou dalších polí.
    💡 Poradit
    Stejný vzor jako u jména, jen jiné pole.
  3. Vygeneruj statistiky: životy 35–60, síla 5–14, úroveň 1–5, zlato 0–200.
    💡 Poradit
    Pozor na horní mez!
    Životy 35 až 60 znamená kostka.Next(35, 61).
  4. Vypiš kartu hrdiny s pruhy ze srdíček a hvězdiček.
    💡 Poradit
    new string('♥', zivoty / 5) a new string('★', uroven).
  5. Vygeneruj pět hrdinů v cyklu a najdi mezi nimi nejsilnějšího.
    💡 Poradit
    Pamatuj si nejlepsiJmeno a nejlepsiHodnota — stejně jako u hledání maxima.
Úroveň Co má zvládnout
Minimum náhodný prvek pole (kroky 1–2)
Rozšíření náhodné statistiky ve správných rozsazích a karta (kroky 3–4)
Výzva pět hrdinů v cyklu a hledání nejsilnějšího (krok 5)
cviceni/cviceni2_generator_hrdiny.cs
Tady se objeví výstupKlikni 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.
Pro učitele — na co si dát pozor

Očekávaný výsledek: pokaždé jiná postava. Ať program spustí aspoň pětkrát — je to nejzábavnější cvičení hodiny.

Kde se zaseknou: - Napíšou jmena[kostka.Next(1, jmena.Length)] a první jméno nikdy nepadne. Nebo Next(jmena.Length + 1) a program spadne na IndexOutOfRangeException. Zopakujte, že Next(5) dává právě indexy 0–4. - U statistik zapomenou na vyloučenou horní mez a napíšou Next(35, 60). Šedesátka pak nikdy nepadne — a nikdo si toho nevšimne. - V kroku 5 použijí uvnitř cyklu stejná jména proměnných jako venku → CS0136. Proto jsou ve vzoru krátká j, p, s, u. - Mohou se objevit dva hrdinové se stejným jménem. To je správné chování, ne chyba — ať to zkusí opravit, kdo chce.

Kdo je hotový dřív: ať přidá náhodnou vlastnost „štěstí" 1–10, ať vygeneruje deset hrdinů a spočítá průměrnou bojovou hodnotu, nebo ať vybere i nejslabšího.

Otázka na závěr: „Proč je v Next u pole jen jedno číslo, a ne dvě?" Protože indexy začínají nulou a Next(délka) dá přesně všechny.

Řešení 2 — jedna z možných variant
reseni/reseni2_generator_hrdiny.cs
Tady se objeví výstupKlikni 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í 3 — Souboj, který nikdy nedopadne stejně (20 min)3. Cvičení

Tvoje zadání:

Minule byl souboj předvídatelný. Dnes do něj pustíš kostku — a hned nebudeš vědět, jak dopadne.

  1. Vylosuj příšeře životy 25–45 a vypiš, na koho jsi narazil.
    💡 Poradit
    int priseraZivoty = kostka.Next(25, 46);
  2. Udělej while souboj, kde hrdina útočí za náhodných 5–12.
    💡 Poradit
    while (priseraZivoty > 0) a uvnitř kostka.Next(5, 13).
    Nezapomeň životy opravdu odečítat.
  3. Přidej kritický zásah — v 15 % případů se poškození zdvojnásobí.
    💡 Poradit
    if (kostka.NextDouble() < 0.15) { utok = utok * 2; }
  4. Nech příšeru kontrovat za 3–9 životů.
    💡 Poradit
    Protiútok jen tehdy, když příšera ještě žije: if (priseraZivoty > 0).
  5. Ukonči souboj, když někdo padne, a vypiš výsledek.
    💡 Poradit
    Do podmínky cyklu přidej && hrdinaZivoty > 0 a po cyklu rozhodni, kdo vyhrál.
Úroveň Co má zvládnout
Minimum náhodné životy příšery a while souboj (kroky 1–2)
Rozšíření kritický zásah a protiútok (kroky 3–4)
Výzva správné ukončení souboje a vyhodnocení (krok 5)
cviceni/cviceni3_souboj.cs
Tady se objeví výstupKlikni 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.
Pro učitele — na co si dát pozor

Očekávaný výsledek: souboj trvá obvykle 3–6 kol a hrdina většinou vyhraje. Občas prohraje — a to je přesně ten okamžik, kvůli kterému se dnešní hodina učí.

Kde se zaseknou: - Zapomenou odečítat životy → nekonečný cyklus. Ukažte stop tlačítko. - Napíšou kostka.NextDouble() < 15 — pak je kritický zásah vždycky. NextDouble je od 0 do 1, takže 15 % je 0.15. - Zapomenou v kroku 5 doplnit && hrdinaZivoty > 0 a hrdina bojuje i se zápornými životy. - Kolo vypíšou správně, ale kolo++ dají do if — pak se počítadlo zasekne.

Kdo je hotový dřív: ať přidá 10% šanci, že hrdina mine úplně, ať dá příšeře šanci na útěk pod 20 % životů, nebo ať zopakuje souboj stokrát a spočítá, kolik procent soubojů hrdina vyhraje.

Otázka na závěr: „Proč není NextDouble() < 0.15 totéž co Next(1, 7) == 1?" Šance jsou jiné (15 % vs. 16,7 %) a NextDouble umí libovolně jemné procento.

Řešení 3 — jedna z možných variant
reseni/reseni3_souboj.cs
Tady se objeví výstupKlikni 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í 4 — Truhly a vzácná kořist (20 min)3. Cvičení

Tvoje zadání:

V dungeonu je dvanáct truhel. Většina je obyčejná, ale jedna z dvaceti skrývá legendární předmět. Zjistíš, jak se dělají pravděpodobnostní pásma.

  1. Hoď si číslem 0–99 a vypiš ho.
    💡 Poradit
    int hod = kostka.Next(100); — jedno číslo v závorce znamená 0 až 99.
  2. Rozděl hod do pásem: 0–4 legendární, 5–19 vzácná, 20–59 obyčejná, zbytek prázdná.
    💡 Poradit
    Řetěz if / else if / else.
    Piš od nejvzácnějšího pásma dolů.
  3. Otevři dvanáct truhel v cyklu a každou vypiš.
    💡 Poradit
    Obal celé vyhodnocení do for (int truhla = 1; truhla <= 12; truhla++).
  4. Počítej, kolik truhel bylo které kvality, a přidávej náhodné zlato.
    💡 Poradit
    Čtyři počítadla před cyklem a v každé větvi zlato += kostka.Next(...).
  5. Vypiš souhrn výpravy a přidej 8% šanci na tajnou chodbu.
    💡 Poradit
    Po cyklu vypiš počítadla a pak if (kostka.NextDouble() < 0.08).
Úroveň Co má zvládnout
Minimum jeden hod a rozdělení do pásem (kroky 1–2)
Rozšíření cyklus dvanácti truhel a počítadla (kroky 3–4)
Výzva souhrn s procenty a tajná chodba (krok 5)
cviceni/cviceni4_truhly.cs
Tady se objeví výstupKlikni 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.
Pro učitele — na co si dát pozor

Očekávaný výsledek: ze dvanácti truhel bývá 4–6 prázdných, legendární padne zhruba v jedné výpravě ze dvou. Nechte je spustit program několikrát — je to nejlepší ukázka toho, že procenta platí jen „v průměru".

Kde se zaseknou: - Napíšou pásma v opačném pořadí (if (hod < 60) první) a legendární se nikdy nevypíše. Klasická past else if — ukažte to na tabuli. - Použijí if místo else if a jedna truhla vypíše tři řádky najednou. - V kroku 3 nechají int hod deklarovaný i venku i uvnitř cyklu → CS0136. Stará deklarace musí pryč. - U procent napíšou (12 - prazdne) / 12 * 100 a dostanou 0 — celočíselné dělení.

Kdo je hotový dřív: ať přidá páté pásmo „prokletá truhla", které bere zlato, ať otevře 1000 truhel a ověří, jestli procenta sedí, nebo ať si pásma uloží do Dictionary a vypíše ceník kořisti.

Otázka na závěr: „Kolik procent truhel má být legendárních a proč jich v jednom běhu bývá víc nebo míň?" Pět procent. Náhoda se k očekávání blíží až u velkého počtu pokusů.

Řešení 4 — jedna z možných variant
reseni/reseni4_truhly.cs
Tady se objeví výstupKlikni 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 17Cvičení 5 — CsQuest: nepředvídatelná výprava (25 min)3. Cvičení

Tvoje zadání:

Finále hodiny. Spojíš náhodu, cykly, podmínky i metody z minulé hodiny do výpravy, která pokaždé dopadne jinak.

  1. Připrav pole příšer a metodu Hod, která hodí kostkou v daném rozsahu.
    💡 Poradit
    static int Hod(Random k, int min, int max) => k.Next(min, max + 1);
    Kostku musíš metodě předat jako parametr.
  2. Projdi cyklem čtyři dny a na každý den vylosuj příšeru a její životy.
    💡 Poradit
    for (int den = 1; den <= 4; den++) a uvnitř náhodný prvek pole.
  3. Přidej do každého dne vnořený while souboj s náhodným útokem.
    💡 Poradit
    Vnitřní cyklus běží, dokud priseraZivoty > 0 && hrdinaZivoty > 0.
  4. Po vyhraném souboji přidej náhodnou odměnu a zkušenosti.
    💡 Poradit
    Odměna jen tehdy, když hrdina přežil. Zlato Hod(kostka, 20, 90).
  5. Ukonči výpravu, když hrdina padne, a vypiš deník výpravy.
    💡 Poradit
    break; ukončí i vnější cyklus dnů.
    Na konci vypiš dny, zlato, zkušenosti a zbývající životy.
Úroveň Co má zvládnout
Minimum metoda Hod a cyklus přes dny s náhodnou příšerou (kroky 1–2)
Rozšíření vnořený souboj a odměny (kroky 3–4)
Výzva ukončení výpravy pomocí break a závěrečný deník (krok 5)
cviceni/cviceni5_vyprava.cs
Tady se objeví výstupKlikni 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.
Pro učitele — na co si dát pozor

Očekávaný výsledek: hrdina přežije celou výpravu zhruba v polovině případů. Nechte třídu spustit program několikrát a porovnat deníky — kdo má nejvíc zlata?

Kde se zaseknou: - Metodě Hod zapomenou předat kostku a napíšou static int Hod(int min, int max), uvnitř použijí kostkaCS0103. Statická metoda nevidí proměnné z programu. Připomeňte minulou hodinu: co potřebuje, to dostane parametrem. - Hod(kostka, 20, 40) používá max + 1 uvnitř metody. Kdo si napíše k.Next(min, max), nikdy nedostane horní hranici — ať si to ověří na Hod(kostka, 1, 1). - Zapomenou break a program pokračuje i po smrti hrdiny. Souboj pak proběhne „naprázdno", protože podmínka while je hned nepravdivá. - Počítadlo prezitychDnu++ dají před souboj místo za něj.

Kdo je hotový dřív: ať přidá metodu VypisPruh(int zivoty) z minulé hodiny, ať dá příšerám různou sílu podle typu (Dictionary z hodiny 8), nebo ať spustí výpravu stokrát a spočítá, v kolika procentech hrdina přežije.

Otázka na závěr: „Co se stane, když do new Random() dáme pevný seed?" Výprava dopadne pokaždé úplně stejně — a to je k nezaplacení při hledání chyb.

Řešení 5 — jedna z možných variant
reseni/reseni5_vyprava.cs
Tady se objeví výstupKlikni 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 18Domácí úkol na příští hodinu4. Domácí úkol

Generátor nočního tábora

Napiš program, který vylosuje, jak proběhne noc v táboře:

  • vylosuj počasí z pole ("jasno", "mlha", "déšť", "bouřka"),
  • vylosuj, kolik hodin se podařilo spát (4–9),
  • s 30% šancí přijde noční návštěva — vylosuj příšeru z pole,
  • spočítej, kolik životů hrdina ráno má (začíná na 40, za každou hodinu spánku +3, za noční návštěvu −10),
  • vypiš ranní hlášení s rámečkem a pruhem životů.

Bonus: nech program prožít sedm nocí za sebou a na konci vypiš, kolikrát pršelo a kolikrát přišla návštěva.

Pro učitele

Úkol je schválně krátký a všechno v něm už dnes viděli: náhodný prvek pole, Next(min, max), NextDouble() na procenta a if. Bonus přidává cyklus a počítadla, tedy hodinu 9.

Při kontrole se ptejte hlavně na dvě věci: je horní mez správně? (spánek 4–9 je Next(4, 10)) a je Random vyrobený jen jednou nahoře? Kdo to má jinak, ať program spustí desetkrát a sám uvidí.

Zobrazit ukázkové řešení domácího úkolu
domaci/domaci_ukol11.cs
Tady se objeví výstupKlikni 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 19Oficiální dokumentace4. Domácí úkol

Dnešní hodina stojí na jediné třídě — System.Random. Tady je všechno, co k ní v dokumentaci najdeš.

Co hledáme Odkaz
Třída Random — přehled learn.microsoft.com – Random Class
Random.Next() — celá čísla learn.microsoft.com – Random.Next
Random.NextDouble() — desetinná čísla learn.microsoft.com – Random.NextDouble
Random.Shared — sdílená instance learn.microsoft.com – Random.Shared
Konstruktor se seedem learn.microsoft.com – Random(Int32)
Random.NextInt64() learn.microsoft.com – Random.NextInt64
Typ double learn.microsoft.com – Typy s pohyblivou řádovou čárkou
Pole a indexy learn.microsoft.com – Arrays
if / else if / else learn.microsoft.com – Selection statements
ArgumentOutOfRangeException learn.microsoft.com – ArgumentOutOfRangeException
IndexOutOfRangeException learn.microsoft.com – IndexOutOfRangeException
Kryptograficky bezpečná náhoda learn.microsoft.com – RandomNumberGenerator
Jak s dokumentací pracovat na hodině

Otevřete stránku Random.Next a nechte třídu najít jedinou větu: „The exclusive upper bound of the random number returned." Pak se zeptejte, co znamená slovo exclusive. Většina si to zapamatuje lépe z anglické dokumentace než z vašeho vysvětlení.

Druhý tip: ukažte přehled třídy Random a spočítejte, kolik metod má. Je jich jen pár — a to je dobrá zpráva. Dokumentace nemusí být strašidelná.

5. Umíme informatiku

Blok 20Navazující cvičení na Umíme informatiku5. Umíme informatiku

Náhoda a pravděpodobnost se dá procvičit i bez psaní kódu. Tahle cvičení se hodí jako rozcvička na začátek hodiny nebo jako úkol navíc.

Téma Odkaz Kdy zařadit
Pravděpodobnost umimeinformatiku.cz – Pravděpodobnost před cvičením 4, jako rozehřátí na pásma procent
Cykly v programování umimeinformatiku.cz – Cykly před cvičením 3, kde se náhoda potkává s while
Rozhodování a podmínky umimeinformatiku.cz – Podmínky kdykoli, opakuje řetěz else if z cvičení 4

Proč to zařazovat: dnešní hodina má v sobě víc matematiky, než se zdá. Kdo tuší, co znamená „pětiprocentní šance", napíše else if pásma správně napoprvé. Kdo to netuší, bude se divit, proč mu legendární truhla padá v každé druhé hře.

Jak to zařadit

Deset minut na pravděpodobnost před cvičením 4 ušetří dvacet minut vysvětlování u tabule. Ideálně nechte třídu hádat, kolik ze dvanácti truhel bude prázdných, zapište tipy na tabuli a teprve pak spusťte program.

Pokud máte na škole placený účet, zadejte pravděpodobnost jako domácí sadu na týden. Dá se to kombinovat s dnešním domácím úkolem — v něm je třicetiprocentní šance na noční návštěvu a děti si mohou předem spočítat, kolik návštěv má za sedm nocí vyjít.