Aplikace B9 Náhodná čísla

Tato lekce nás zavede do říše náhodných čísel. V minulé lekci B8 jsme si vytvořili seznam obrázků (Images), v této lekci si uděláme seznamů více a budeme z nich vybírat podle náhodných čísel.

název: B9 Náhodná čísla
kategorie: B mírně pokročilí
ref.číslo: B9
projekt: 10+10 dní s microbitem pro mírně pokročilé, lekce B9
verze: 01, 2017-04-13
autor: Ivo Obr, Lanškroun


Tato lekce nás zavede do říše náhodných čísel. Co jsou náhodná čísla? Házíme-li kostkou (a nešvindlujeme) tak čísla, která padají na kostce se nazývají náhodná. Každé číslo, které může padnout má stejnou pravděpodobnost že se objeví na horní straně kostky. To platí, pokud je kostka opravdu krychle, je vyvážená atd. Stejné platí například pro házení mincí, u ní máme jen dvě možnosti a říkáme, že je náhodné, která strana padne (rub nebo líc).

My v naší lekci využijeme náhodných čísel k výběru textu ze seznamu. V minulé lekci B8 jsme si vytvořili seznam obrázků (Images), v této lekci si uděláme seznamů více a budeme z nich vybírat podle náhodných čísel.

Nejdříve si ale musíme něco říci o tom, jak náhodná čísla získáme v jazyce MicroPython. Máme k tomu tyto možnosti :

a) pomocí rozsahu hodnot celých čísel

         random.randint(dolní_mez,  horní_mez)
(vytvoří náhodné celé číslo v rozsahu hodnot od “dolní_mez” včetně do hodnoty “horní_mez” včetně. )

b) pomocí rozsahu s volitelnou horní hranicí :

         random.range(N)
(vytvoří náhodné celé číslo v rozsahu hodnot od  nuly do hodnoty N, kde N už není součástí vygenerovaného čísla. Hodnota N se nikdy nevygeneruje.)

c) pomocí pevného rozsahu od 0.0 do 1.0 :

         random.random()
(vytvoří náhodné celé číslo v rozsahu hodnot od 0.0000000 do hodnoty 1.0000000 včetně)

d) pomocí odkazu na seznam hodnot:

        random.choice(“jméno seznamu hodnot”)
( tato volba je velmi dobrá pro náš záměr, protože se nemusíme starat o počet členů seznamu. Pokud do seznamu přidáme další členy nebo je ubereme, tak se nám příkaz pro získání náhodného výběru nemění. Výsledkem provední tohoto výrazu není náhodné číslo ale konkrétní člen ze seznamu.)

e) existují ještě další možnosti práce s náhodnými čísly které jsou  pro speciálnější programování a nebudeme je tady uvádět.

Nevím, zdali znáte hru, kterou jsme často hrávali ve škole ještě v dobách před existencí tabletů a mobilů. Šlo o vytváření vět, kdy přídavná jména, podstatné jméno, sloveso atd. se přidávali na papírový pásek a to tak, že předchozí slova pisatel neviděl (byly přeloženy). Hru hrálo více osob. Po napsání posledního slova se pásek rozbalil a četla se věta. Pokud hráči dodržovali správná pravidla, význam vět byl natolik zábavný, že tato hra nás vždy velmi pobavila.

My si zkusíme na tomto principu vytvořit hru, která nás, jak doufám také dobře pobaví. Čím delší seznamy budou (více slov), tím bude hra zábavnější a nebude se nikdy žádná věta opakovat.

My si pomocí mikropočítače složíme větu, jejíž struktura bude :

Jaký         Kdo      Jak to dělá      Co dělá     Kde to dělá    Proč to dělá.

Každý člen věty bude slovo, které náhodně vybereme ze seznamu slov a větu vypíšeme na displeji. Vypsání věty budeme iniciovat stiskem tlačítka “A”.

Vytvoříme si šest seznamů slov a jména seznamů si zvolíme podle jejich významu: “jaky”, “kdo”, “jak”, “co”, “kde” a “proc”. Náš program bude pomocí příkazu “while True” se opakovat stále dokola a v těle tohoto cyklu budeme testovat, zda-li došlo ke stisku tlačítka “A” (příkaz “if”). Pokud k tomu došlo, zobrazíme na displeji pomocí příkazu “display.scroll()” náhodně vybraná slova. Abychom mohli celou větu – její výpis na displej stále opakovat (parametr příkazu display.scroll(veta, loop=True, wait=False)), do proměnné se jménem “veta” si všechna slova zapíšeme a pak celý řetězec slov budeme jedním příkazem vypisovat.

V následném obrázku je ukázán kód základního programu. Pod obrázkem najdete komentář a vysvětlení některých nastavení :

řádek 2:

Abychom mohli používat všechny výrazy spojené s náhodnými čísly (objektem “random”), tak na začátku programu si musíme programové kódy související s generováním náhodných čísel do programu vložit. Standardně nejsou součástí.

řádek 3:

Nadefinujeme si hned na začátku proměnnou, v delších programech bychom ještě připojili komentář přímo do programu, jaký obsah bude proměnná mít. Tady vidíme, že se bude jednat o řetězec znaků.

řádek 4-5:

Vytvoříme si seznam slov, které budou stát jako přídavné jméno, bude to první slovo ve větě. Každé slovo uzavřeme do apostrofů (nikoliv do uvozovek!) a oddělíme od následujícího slova čárkou a mezerou. Pokud máme více členů seznamu, musí každý další řádek jednoho seznamu začínat v pozici (sloupci), kde je umístěn první člen seznamu. Každé slovo v seznamech končí mezerou, aby slova byla oddělena. V posledním seznamu “proc” jsou slova ukončena tečkou.

řádek 13:

Po spuštění programu vypíšeme na displeji šipku ukazující na tlačítko “A”. Je použit předem nastavený obrázek (Image).

řádek 15:

Test, zda-li bylo stisknuto (a uvolněno) tlačítko “A”. Pokud ANO, tak budou prováděny příkazy, které jsou odsazeny o čtyři sloupce od příkazu “if”.

řádek 16:

Do proměnné “veta” se vloží prvé slovo. Pokud byl nějaký obsah v této proměnné, je smazán a  je do této proměnné vloženo slovo ze seznamu “jaky”. Slovo je náhodně vybráno.

řádek 17 – 21:

Do proměnné “veta” je vložen původní obsah  proměnné “veta” a k němu je dodáno (připojeno) slovo náhodně vybrané ze seznamu. Takto se postupně naplní proměnná “veta”, poslední slovo je pak zakončeno tečkou.

řádek 22:

Na displeji se vypisuje obsah proměnné “veta”.

Pokud nezadáme parametr “delay=”, je každý posun textu o jeden sloupec doleva proveden v čase 150msec. Protože čtení bez háčků a čárek je obtížnější, posun textu mírně zpomalíme tím, že parametr zadáme s větší hodnotou času 180msec. Můžete si vyzkoušet různé rychlosti a upravit si je podle toho, co vám bude vyhovovat.

Parametr “loop=True” říká, že se výpis obsahu proměnné “veta” bude opakovat stále dokola a to do té doby, než bude znovu použit nějaký příkaz pro výpis na displeji. Pokud bychom zadali “loop=False”, výpis se provede jen jednou. Tato hodnota je standardní a není ji třeba uvádět.

Parametr “wait=False” nastavuje, zda-li příkaz čeká na své dokončení (až se nám řetězec znaků na displeji celý vypíše) nebo nečeká. Standardně je nastaveno “wait=True”. To znamená, že další příkaz se neprovádí, dokud se celý text na displeji nevypíše.

Ale tady pozor! My jsme si nastavili parametrem “loop=True”, že se bude výpis textu opakovat stále dokola, to znamená, že náš text je “nekonečně” dlouhý a bude se čekat na jeho dokončení. Na tomto příkazu by se náš program zastavil a už by ani nereagoval na stisk tlačítka “A”, protože příkaz “while” ani “if” by nebyl proveden. Takže tento parametr nastavíme tak, aby se nečekalo na dokončení výpisu textu na displeji a mikropočítač začal provádět další příkazy za “display.scroll()”. To bude příkaz “while” a opět vše celé poběží znovu. Pokud nestiskneme tlačítko “A”, tak se nevygeneruje nová věta, a na displeji se bude stále dokola opakovat stejný text.

Poznámka :

  • hra bude zábavnější, pokud budou seznamy delší

Úkoly pro tuto lekci :

  • vyzkoušejte si všechny možné kombinace parametrů u “display.scroll()”
  • rozšiřte  si seznamy slov o další slova
Posted in kat B - mírně pokročilí.