System.Random, .Next(), .Next(max), .Next(min, max), .NextDouble(), seed, pravděpodobnost, vážená kořistTenhle 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 |
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.
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.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í.
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.
Spusť to několikrát za sebou. Pokaždé jiná čísla.
Randomje 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…
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).
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.
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:
pole.Length je počet prvků, třeba 5.kostka.Next(5) dá 0, 1, 2, 3 nebo 4.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.
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?
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.
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.
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íť.
Next(1, 21)).Next(1, 6) — kolikrát padne šestka?new Random() za new Random(7) a spusť dvakrát.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á.
new Random(1) — vyjde to pokaždé stejně?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.
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.
NextDouble() < 0.05 místo Next(100) < 5.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.
Souboj šanci na kritický zásah.new Random() na new Random(2026) — teď je výprava pokaždé stejná.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.
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 |
Tvoje zadání:
Než přidáš náhodu do hry, musíš si osahat kostku. Hodíš si, spočítáš a ověříš, jestli je poctivá.
- Vyrob
Random, hoď si jednou kostkou 1–6 a hod vypiš.💡 Poradit
Random kostka = new Random();a pakkostka.Next(1, 7).
Horní mez se nepočítá — proto sedmička.- Hoď desetkrát v cyklu a ke každému hodu vypiš tečky.
💡 Poradit
Cyklusfor (int i = 1; i <= 10; i++).
Tečky:new string('●', hod).- Hoď dvěma kostkami, vypiš součet a poznamenej, jestli padl dublet.
💡 Poradit
Dva hody do dvou proměnných a pakif (a == b).- Spočítej ve stovce hodů, kolikrát padla šestka.
💡 Poradit
Před cyklemint sestek = 0;, uvnitřif (hod == 6) { sestek++; }.- Přidej dvacetistěnnou kostku a vyhodnoť kritický úspěch a neúspěch.
💡 Poradit
Dvacetistěnka jekostka.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) |
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.
Tvoje zadání:
Každé spuštění vyrobí jinou postavu. Jméno, povolání i statistiky vybere kostka.
- Vyber náhodné jméno z pole
jmena.💡 Poradit
Vzor jejmena[kostka.Next(jmena.Length)].
UvnitřNextje jen jedno číslo — délka pole.- Přidej náhodné povolání a domov ze dvou dalších polí.
💡 Poradit
Stejný vzor jako u jména, jen jiné pole.- 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).- Vypiš kartu hrdiny s pruhy ze srdíček a hvězdiček.
💡 Poradit
new string('♥', zivoty / 5)anew string('★', uroven).- Vygeneruj pět hrdinů v cyklu a najdi mezi nimi nejsilnějšího.
💡 Poradit
Pamatuj sinejlepsiJmenoanejlepsiHodnota— 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) |
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.
Tvoje zadání:
Minule byl souboj předvídatelný. Dnes do něj pustíš kostku — a hned nebudeš vědět, jak dopadne.
- Vylosuj příšeře životy 25–45 a vypiš, na koho jsi narazil.
💡 Poradit
int priseraZivoty = kostka.Next(25, 46);- Udělej
whilesouboj, kde hrdina útočí za náhodných 5–12.💡 Poradit
while (priseraZivoty > 0)a uvnitřkostka.Next(5, 13).
Nezapomeň životy opravdu odečítat.- Přidej kritický zásah — v 15 % případů se poškození zdvojnásobí.
💡 Poradit
if (kostka.NextDouble() < 0.15) { utok = utok * 2; }- Nech příšeru kontrovat za 3–9 životů.
💡 Poradit
Protiútok jen tehdy, když příšera ještě žije:if (priseraZivoty > 0).- Ukonči souboj, když někdo padne, a vypiš výsledek.
💡 Poradit
Do podmínky cyklu přidej&& hrdinaZivoty > 0a 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) |
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.
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.
- Hoď si číslem 0–99 a vypiš ho.
💡 Poradit
int hod = kostka.Next(100);— jedno číslo v závorce znamená 0 až 99.- Rozděl hod do pásem: 0–4 legendární, 5–19 vzácná, 20–59 obyčejná, zbytek prázdná.
💡 Poradit
Řetězif/else if/else.
Piš od nejvzácnějšího pásma dolů.- Otevři dvanáct truhel v cyklu a každou vypiš.
💡 Poradit
Obal celé vyhodnocení dofor (int truhla = 1; truhla <= 12; truhla++).- 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ětvizlato += kostka.Next(...).- Vypiš souhrn výpravy a přidej 8% šanci na tajnou chodbu.
💡 Poradit
Po cyklu vypiš počítadla a pakif (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) |
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ů.
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.
- 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.- 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.- Přidej do každého dne vnořený
whilesouboj s náhodným útokem.💡 Poradit
Vnitřní cyklus běží, dokudpriseraZivoty > 0 && hrdinaZivoty > 0.- Po vyhraném souboji přidej náhodnou odměnu a zkušenosti.
💡 Poradit
Odměna jen tehdy, když hrdina přežil. ZlatoHod(kostka, 20, 90).- 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) |
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í kostka → CS0103. 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.
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.
Ú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í.
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 |
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á.
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.
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.