<jupyter_start><jupyter_text>ÚvodAhojte a vitajte na úvodnej - prípravnej hodine brutálnej akadémie. Počas tejto hodiny sa zoznámime s viacerými témami, na ktorých budeme celý zvyšok roka stavať. Konkrétne pôjde o:- Zoznámenie sa s prostredím, v ktorom sa nachádzame - **Google Colaboratory**- Základy programovania v jazyku **Python**- Zopakovanie matematiky v oblasti **Pravdepodobnosti**a všelijaké malé drobnosti, ktoré sa na vás nalepia cestou.Pred pokračovaním poprosíme spustiť príkaz z lišty `Runtime -> Run all`.  Google ColaboratoryAko ste si iste všimli, nachádzame sa v nejakom dokumente, ktorý má možno trocha netradičný formát. Je rozdelený na bunky, ako je táto alebo predchádzajúca. Šípkami alebo klikaním myšou sa medzi nimi vieme ľahko hýbať. Každá takáto bunka má dve základné možnosti, ako môže vyzerať:- textový blok, ako tento alebo predchádzajúci- blok s kódom, ako nasledujúca bunka<jupyter_code># Tu sa nachádza PYTHON 3
print("Brutálne") # všetky výpisy sa ukážu pod bunkou
2 + 2 # výsledok posledného výrazu sa vypíše na záver<jupyter_output>Brutálne<jupyter_text>Okrem dvoch typov buniek máme aj dva režímy, v ktorých sa môžme nachádzať: - **Edit mode** - upravovací režím - vtedy môžeme **obsah** ľubovoľnej bunky meniť podľa našich predstáv- **Command mode** - príkazový režím -  slúži na operácie s bunkami (pridávanie nových, mazanie nepotrebných, ...) a celým prostredímDo upravovacieho režímu vchádzame stlačením klávesy **Enter** a vychádzame z neho stlačením klávesy **Esc**.  Edit modeV rámci upravovacieho režímu môžeme upravovať každú bunku podľa svojho gusta. Možnosti sa líšia podľa toho, či ide o textovú alebo programovaciu bunku, niektoré možnosti sú ale rovnaké. Keď si všimnete ľubovoľnu bunku v rámci upravovacieho režímu, má vpravo hore lištu s tlačidlami, ktoré robia všeličo možné. Poskúšajte si ich.  Bunka s textomAk si prepnete bunku s textom do upravovacieho režímu, rozdelí sa vám bunka na dve časti. V jednej píšete zdrojový text a v druhej sa vám ukazuje text v takej podobe, v akej ho uvidia čitatelia. Tento zdrojový text miestami pripomína jednoduchý programovací jazyk - čo svojím spôsobom aj je. Ide o jazyk **Markdown**. Markdown je hlavným spôsobom písania textov v programátorskej komunite. Napríklad všetky dokumentácie k programovacím jazykom sú písané v tomto jazyku. Čo všetko s ním dokážete spraviť si môžete pozrieť [tu](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).*Nasleduje krátka ukážka*Možeme robiť všelijaké úpravy textov na **bold**, *italic*, alebo použiť [odkazy](https://giphy.com/gifs/9jumpin-wow-nice-well-done-xT77XWum9yH7zNkFW0/fullscreen), štruktúrovať dokument cez rôzne úrovne  nadpisov, prikladať obrázky priamo do textu ![alt text](https://i.imgflip.com/3y9ov.jpg "Aha, ešte aj toto!") písať `strojovým písmom` alebo dokonca ```celébloky komplikovaného kódu*bez* formátovacích %  $) 59 =23 )(@_ @)($()*)problémov```alebo robiť pekné tabuľky| Technológia        | Pocit           || ------------- |:-------------:| | Google Colab      | wow || Markdown     | such magic      |navyše máme prístupný aj matematický jazyk **LaTeX** na komplikované vzorce$$\sum_{n=0}^\infty \frac{(-1)^n}{2n + 1} = \left(\frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \dots\right) = \frac{\pi}{4}$$Zvláda to proste fakt veľa vecí. Hor sa do experimentovania!  Bunka s kódomDo bunky s kódom môžete písať ľubovoľný kód fungujúci v programovacom jazyku `Python 3`. Nemá k dispozícii nainštalované všetky knižnice, ale je ich tam dosť. Navyše, kód si viete aj priamo spustiť. Stlačením šípky vľavo od bloku kódu alebo `Ctrl + Enter` sa vám váš Colab pripojí (zdarma) na servery Google a bude vyhodnocovať vaše požiadavky. Skúste si to s nasledovnou bunkou. Môžete si ju aj upraviť a spustiť znova.<jupyter_code>import graphviz

d = graphviz.Digraph(graph_attr={"rankdir": "LR"})
d.edge("študenti", "brutálna akadémia", label = "začiatok", color = "blue")
d.edge("brutálna akadémia", "brutálni študenti", label = "koniec", color="red")
d<jupyter_output><empty_output><jupyter_text>Výsledok posledného príkazu, ktorý zavoláte, sa vám zobrazí pod bunkou. A to nemusí byť len text alebo číslo. V tomto prípade to bol graf, ktorý vie Colab zobraziť priamo obrázkom.Bunky s kódom sa snažia byť blízko plnohodnotným editorom - programom na úpravu kódu. Takže ak si napríklad nepamätáte presný názov premennej alebo funkcie, môžte začať písať jej názov a stlačiť tabulátor - automaticky sa vám doplní. Vyskúšajte si to v bunke nižšie, pozrieme sa čo všetko nám ponúka `graphviz` za funkcie.<jupyter_code># graphviz. # odstráňte mriežku zo začiatku riadku, navigujte kurzor za bodku a stlačte TAB<jupyter_output><empty_output><jupyter_text>Všimnite si, že `graphviz` sme naimportovali v bunke vyššie a napriek tomu je dostupný aj v ďalšej bunke. Všetky bunky v Colabe žijú v jednom spoločnom prostredí, to znamená, že hocičo si vytvorím v hociktorej bunke, mám k tomu prístup všade. Napríklad:<jupyter_code>d<jupyter_output><empty_output><jupyter_text>Oproti normálnemu Pythonu máme ale navyše niekoľko špeciálnych príkazov, ktoré sa nazývajú `magics`. Môžme si napríklad ľahko odmerať trvanie ľubovoľného príkazu:<jupyter_code>%timeit a = list(i for i in range(1000000))<jupyter_output>10 loops, best of 3: 79.2 ms per loop<jupyter_text>Napríklad vytvorenie zoznamu milión prvkov trvá zhruba 93 ms. Všetky možné `magics` príkazy si môžete pozrieť napríklad [tu](https://ipython.readthedocs.io/en/stable/interactive/magics.html). Ak máte problémy s jazykom Python, základy pokryjeme nižšie - v tejto časti sme sa venovali všeobecne bloku s kódom.   Command modePríkazový režím je dôležitou súčasťou funkcionality Colabu. Aj keď môže byť na prvý pocit neintuitívny a ťažko ovládateľný, po krátkej dobe si zvyknete na klávesové skratky a bude sa vám ľahko ovládať.Po prepnuti do command modu klávesou `Esc` máte k dispozícii celú škálu klávesových skratiek, ktoré vám pomôžu meniť bunky zvonka. Väčšina z týchto klávesových skratiek sa začína stlačením kombinácie kláves `Ctrl + M` a následne sltačením ďalšieho tlačítka. Vyskúšajte si nasledovné kombinácie:- `Ctrl + M  b` $~\rightarrow~$ pridanie novej bunky pod súčasnú bunku- `Ctrl + M  a` $~\rightarrow~$ pridanie novej bunky nad súčasnú bunku- `Ctrl + M  d` $~\rightarrow~$ vymazanie súčasnej bunky (dá sa to vrátiť pomocou *Undo*)- `Ctrl + M  m` $~\rightarrow~$ zmena bunky na textovú- `Ctrl + M  y` $~\rightarrow~$ zmena bunky na kódovúA na záver najdôležitejšia: `Ctrl + M  h` $~\rightarrow~$ ukáže všetky klávesové skratky aj s možnosťou ich zmeny.Aj keď sa všetky spomenuté operácie dajú robiť aj pomocou klikania na lištu, silno odporúčam naučiť sa používať klávesové skratky pre zrýchlenie fungovania. V ideálnom prípade v Colabe nepotrebujete vôbec používať myšku.  Historické okienkoGoogle Colab nie je nová myšlienka. Podobné prostredie sa v softvéri [Mathematica](https://www.wolfram.com/mathematica/) vyskytovalo už od roku 1980, čo bol ale vždy komerčný softvér určený primárne matematikom. Prvé prostredie z rovnakej rodiny ako je Google Colab bol takzvaný `IPython Notebook`, ktorý sa prvýkrát objavil v roku 2011. Jeho novšie verzie sú ešte dodnes používané. V roku 2015 sa rozšíril na [Project Jupyter](https://jupyter.org/), ktorý má za sebou obrovskú podporu v rámci open-source community. Každým rokom vychádzajú nové vychytávky a aktuálne okrem Pythonu podporuje aj desiatky ďalších programovacích jazykov.Jupyter a Google Colab sa používa predovšetkým na prototypy, experimenty, interaktívne vizualizácie a prezentácie. Jeho úloha vo firmách ešte nie je úplne ustálená, ale všeobecne jeho využitie je spájané skôr s výzkumom ako s koncovým riešením.Ako ste iste vytušili, Google Colab je verzia Jupyteru od spoločnosti Google. Veľká výhoda Google Colabu (a hlavný dôvod, prečo sme teraz v ňom a nie v Jupyteri) je, že na rozbehnutie tohto prostredia nepotrebujete naozaj nič a svoje zmeny, poznámky alebo experimenty si môžte uložiť priamo na svoj Google Drive. Naozaj, Google Colab je len ďalší dokument, podobne ako Sheets, Docs, Slides. Colab si môžete otvoriť hocikde, meniť ho, shareovať, dávať doňho komentáre, spoluvytvárať s ostatnými (COLABorate). Odporúčam si v rámci každej hodiny uložiť Colab s ktorým pracujete priamo na svoj disk, aby ste ho mali vždy k dispozícii a vaše zmeny sa po skončení nestratili.  PythonPre potreby nášho kurzu budeme používať Python. Je to jeden z najpoužívanejších programovacích jazykov na svete, hlavne vďaka jednoduchosti práce s ním. Často sa jeho kód číta ako angličtina a preto aj neskúsený človek si vie domyslieť, čo kód pred ním asi robí. Pozrime sa napríklad na nasledovný blok kódu.<jupyter_code>import random 

N = 10000000
count = 0
for i in range(N):
    x = random.random()
    y = random.random()
    if (x ** 2 + y ** 2) <= 1:
        count += 1
count / N * 4<jupyter_output><empty_output><jupyter_text>Na prvý pohľad nie je jasné, čo tento blok kódu robí, ale vidíme, že výsledok je podozrivo blízky k $\pi$. Čo sa to tam teda stalo?Skúste sa nad tým zamyslieť a pochopiť (aj bez toho, aby ste vedeli ako funguje Python). Potom pokračujte ďalej.  Nápoveda V kóde je niekoľko funkcií, ktoré možno nepoznáte. Konkrétne- `random.random()` $~\rightarrow~$ vygeneruje náhodné reálne číslo medzi 0 a 1- `x ** 2` $~\rightarrow~$ operácia `**` sa používa ako umocňovanie- `for i in range(N)` $~\rightarrow~$ v princípe angličtina, pre každé i od 0 do `N` sprav, čo vidíš ďalej  Riešenie Robíme nasledovnú procedúru:- vygenereujeme `N` náhodných bodov v jednotkovom štvorci- spočítame aká časť z nich skončí v jednoktovej štvrťkružnici so stredom v $[0, 0]$ - výsledok vynásobíme 4Nápomocný obrázok<jupyter_code>%%html

<svg viewbox ="50 0 100 50" width=400>
<rect width="100" height="100" stroke-width="2" fill="blue"/>
<ellipse  fill="yellow" cx="50" cy="50" rx="50" ry="50"/>
<text x="75" y="30" fill="red" text-anchor="middle" font-size="10">&#x3C0 / 4</text>
<text x="75" y="48" fill="black" text-anchor="middle" font-size="6">1</text>
</svg><jupyter_output><empty_output><jupyter_text>Z obrázka je (snáď) jasné, že $\tfrac{\pi}{4}$ bodov skončí v štvrťkružnici a teda ak vygenerujeme dostatočne veľa bodov a vynásobíme to 4, dostaneme dobré priblíženie číslu $\pi$.  RýchlokurzPri učení Pythonu platia nasledovné zásady:- Google je váš kamarát. Ak neviete čo sa deje, skúste vygoogliť niečo z toho, čo je pred vami, je dosť pravdepodobné, že vám to pomôže.- Ak potrebujete vysvetlenie ľubovoľnej funkcie, najrýchlejší spôsob je spustiť príkaz `nazov_funkcie?`. Colab vám ukáže dokumentáciu k danej funkcii.<jupyter_code># random.random? # odkomentujte (odstráňte mriežku zo začiatku) a spustite<jupyter_output><empty_output><jupyter_text>Namiesto mnou pripraveného tutorialu vám odporúčam prebehnúť niečo ako https://learnxinyminutes.com/docs/python3/. Popri tom, ako si to budete prechádzať, skúšajte si zároveň jednotlivé príkazy priamo tu v rámci kódiacej bunky. Neusíte všetky, ale hlavne tie, ktoré vám na prvý pohľad nie sú jasné, čo vlastne robia. Jedna vec je si príkazy prečítať a pochopiť, druhá vec je si ich skúsiť a trocha sa s nimi pohrať, pozmeniť ich a tým si zlepšiť pochopenie. Nechal som vám tu prázdnu bunku na experimenty:<jupyter_code><jupyter_output><empty_output><jupyter_text>Bolo by fajn ak by ste si preleteli všetko až po koniec časti 5. Časti 6 a 7 sú už pokročilejšie a nie až tak potrebné.Akonáhle sa na vás nalepia nejaké základy, všetko ostatné by ste mali vedieť zvládať "on the fly". Príklady na precvičenie Pythonu vás čakajú v ďalšej kapitole.  Pravdepodobnosť V rámci tohto kurzu sa budeme veľa venovať pravdepodobnosti, keďže spolu so štatistikou sú základom praktickej matematiky. Na zopakovanie základných a aj pokročilejších konceptov a utvrdenie predstáv o nich si prejdeme sadou riešených príkladov zo stredoškolskej pravdepodobnosti. Nad každým príkladom sa najprv zamyslite, skúste si ho zrátať a následne si prečítajte ponúknuté riešenie. Príklady sú zhruba zoradené od veľmi ľahkých po náročné.Veľa z príkladov má taktiež riešenie formou simulácie - kódu, ktorý s veľkou presnosťou odhadne požadovaný výsledok. Skúste si takýto kód napísať pre každý z príkladov. Ak vám to nepôjde, pozrite si naše simulácie - po niekoľkých by vám malo byť celkom jasné, ako ich robiť aj bez našej pomoci.  Hod kockouAká je šanca, že na jednej kocke padne číslo väčšie ako 4?  Riešenie Dokopy máme 6 možností a z toho 2 vyhovujú našim požiadavkam. Riešenie je teda $\tfrac{2}{6} = \tfrac{1}{3}$.*Pozn.:* Počet vyhovujúcich možností vydelených počtom všetkých možností je jedna z najdôležitejších techník rátania pravdpeodobnosti.<jupyter_code>def hod_kockou():
    return random.randint(1, 6)

N = 1000000
sum(hod_kockou() > 4 for i in range(N)) / N<jupyter_output><empty_output><jupyter_text>Súčet dvoch hodov kockamiAká je šanca, že na dvoch kockách hodím v súčte číslo 8 alebo viac?  Riešenie Dokopy máme $6 \cdot 6 = 36$ možností a z toho našim požiadavkam vyhovujú kombinácie ```[2, 6], [3, 5], [4, 4], [5, 3], [6, 2], [3, 6], [4, 5], [5, 4], [6, 3], [4, 6], [5, 5], [6, 4], [5, 6], [6, 5], [6, 6].``` Dokopy ich je 15 a výsledok dostávame $\tfrac{15}{36} = \tfrac{5}{12}.$*Pozn.:* Pri podobných je dôležité nájsť si systém, aby sme nezabudli zarátať žiadnu z možností. Všimnite si náš systém vo vzorovom riešení.<jupyter_code>def sucet_hodov_dvoch_kociek():
    return random.randint(1, 6) + random.randint(1, 6)

N = 1000000
sum(sucet_hodov_dvoch_kociek() >= 8 for i in range(N)) / N<jupyter_output><empty_output><jupyter_text>Súčin dvoch hodov kockamiAká je šanca, že na dvoch kockách hodím v súčine číslo 5 alebo viac?  Riešenie Dokopy máme $6 \cdot 6 = 36$ možností a z toho našim požiadavkam nevyhovujú kombinácie ```[1, 1], [1, 2], [1, 3], [1, 4],[2, 1], [2, 2],[3, 1],[4, 1]``` Dokopy je nevyhovujúcich 8 a výsledok dostávame $\tfrac{36 - 8}{36} = \tfrac{7}{9}.$*Pozn.:* Spočítať nevyhovujúce je niekedy ľahšie ako vyhovujúce, mali by sme to mať na pamäti.<jupyter_code>def sucin_hodov_dvoch_kociek():
    return random.randint(1, 6) * random.randint(1, 6)

N = 1000000
sum(sucin_hodov_dvoch_kociek() >= 5 for i in range(N)) / N<jupyter_output><empty_output><jupyter_text>Párny počet vrchovHodím 5 mincami, aká je šanca, že mi padne párny počet vrchov?  Riešenie Ak ku každému výsledku hodov priradím výsledok získaný otočením každej mince naopak, priradil som ku každému výsledku práve jeden výsledok opačnej parity. Párnych a nepárnych možností je teda rovnako veľa a výsledkom je $\tfrac{1}{2}$.*Pozn.:* Priraďovanie možností (takzvaná bijekcia) pomáha v prípadoch, keď je presný počet ťažký, ale platia preň nejaké vzťahy. Rovnaký postup by sme vedeli použiť aj pre ľubovoľný iný nepárny počet hodov.<jupyter_code>def pocet_vrchov_minci(pocet_minci):
    return sum(random.randint(0, 1) for i in range(pocet_minci))

def je_parne(n):
    return (n % 2) == 0

N = 1000000
sum(je_parne(pocet_vrchov_minci(5)) for i in range(N)) / N<jupyter_output><empty_output><jupyter_text>Párny počet vrchov 2Hodím 10 mincami, aká je šanca, že mi padne párny počet vrchov?  Riešenie Všetky možné výsledky hodov 10 mincami môžme dostať tak, že zoberieme všetky možné výsledky hodov 9 mincami a ku každému postupne pridáme jeden spod, respektíve jeden vrch ako 10. hod. Máme záruku, že parita vrchov bude v týchto dvoch možnostiach odlišná, keďže sa zhodujú v 9 minciach a líšia v desiatej. Takýmto spôsobom sme zase dostali priradenie medzi párnymi a nepárnymi výsledkami a teda výsledok je zase $\tfrac{1}{2}$.*Pozn.:* Je možné, že ste takýmto spôsobom vyrátali už minulý príklad, argument sa dá použiť rovnaký.<jupyter_code>N = 1000000
sum(je_parne(pocet_vrchov_minci(10)) for i in range(N)) / N<jupyter_output><empty_output><jupyter_text>Cibuľky a klobáskyV kuchyni som našiel posledných 7 kúskov klobásky a posledných 10 krúžkov cibuľky. Koľkými rôznymi spôsobmi si ich môžem navliecť na špíz? Symetrické špízy sa rátajú za rovnaké.  Riešenie Mám 17 miest, kam môžem umiestniť 7 klobások, zvyšné budú cibuľové krúžky. Prvú klobásku môžem dať na 17 miest, druhú na 16, tretiu na 15, a tak ďalej až po 11. Ak vynásobím všetky tieto čísla, tak zarátam aj rôzne preusporiadania klobások, z ktorých vyjde ale vždy rovnaký špíz. Vydelím preto výsledné číslo počtom preusporiadaní 7 klobások, teda $7!$. Výsledné číslo teda bude $$\frac{17 \cdot 16 \cdot 15 \cdot 14 \cdot 13 \cdot 12 \cdot 11}{7!} = \binom{17}{7} = 19448$$Keďže špíz je rovnaký z oboch strán, musím odčítať zrkadlovo rovnaké možnosti. Nie je to jednoduché predelenie dvoma, lebo niektoré možnosti sú symetrické, napríklad `KCCKCCCKKKCCCKCCK`. Stačí mi ale odčítať polovicu nesymetrických možností.Aby bolo navlečenie symetrické, musí byť v strede klobáska, lebo ich je nepárny počet. Následne na zvyšných 8 miest na každej strane budem chcieť umiestniť symetricky 3 klobásky. Počet týchto možností je daných kombinačným číslom $\binom{8}{3} = 56$. Konečný výsledok dostaneme ako$$19448 - \frac{19448 - 56}{2} = 9752.$$*Pozn.:* Prvýkrát sme použili kombinačné čísla. Predpokladáme, že ste sa s nimi stretli a poznáte ich.  Guľôčky v jamôčkachMám vedľa seba 10 jamôčok a mám vo vrecúšku 20 rovnakých guľôčok. Koľkými roznými spôsobmi môžem rozdeliť tieto guľočky do jamôčok?  Riešenie Každý spôsob rozdelenia guľúčok do jamôčok môžme reprezentovať zápisom paličiek a kružkov, kde napríklad zápis ```oo|oooo|oooo|ooo|oo|o||o||ooo```znamená, že v prvej jamôčke sú 2 guľôčky, v druhej 4, tretej 4, štvrtej 3, piatej 2, šiestej 1, siedmej 0, ôsmej 1, deviatej 0 a desiatej 3. Každé jedno zoradenie týchto 9 paličiek a 20 krúžkov bude reprezentovať jedno rozloženie guľočok v jamôčkach a zároveň každé jedno roloženie guľôčok v jamôčkach reprezentuje jedno zoradenie paličiek a krúžkov. Stačí nám teda porátať koľko je týchto zoradení. To už je jednoduché, lebo potrebujeme iba vybrať 9 paličiek spomedzi 29 objektov, čo je vyjadriteľné kombinačným číslom $\binom{29}{9} = 10015005$.*Pozn.:* Transformovať úlohu na ekvivaletnú a vyriešenie novej je často ľahšie, ako zápoliť priamo s pôvodným zadaním.  Cesty po mriežkeStojíme v bode $[0, 0]$ mriežky 10x10 a chceme sa dostať do bodu $[10, 10]$ iba presunom medzi mrežovými bodmi a vždy v smere vpravo alebo hore. Koľko možných ciest existuje?  Riešenie Všetky cesty vieme zapísať ako postupnosť 20 rozhodnutí, kde máme ísť dokopy 10x hore a 10x vpravo. Vyberáme teda 10 momentov, kedy pôjdeme hore, z 20 možných rozhodnutí, z čoho dostávame $\binom{20}{10} = 184756$.*Pozn.:* Táto úloha je v princípe rovnaká ako predchádzajúca. V pravdepodobnosti to tak občas býva, že rôzne vyzerajúce úlohu sú vlastne tie isté.  Pár v pokriPotiahnem si 5 kariet z 52-kartového pokrového balíka, aká je šanca, že budem mať na ruke práve jeden pár? Ani trojicu, ani dva páry, jeden pár.  Riešenie Všetkých možných pätíc je $52 \cdot 51 \cdot 50 \cdot 49 \cdot 48$. V tomto počte sú zarátané aj rovnaké pätice v rôznom poradí. Aby sme zarátali každú päticu iba raz, predelíme výsledok všetkými možnými usporiadaniami 5 kariet, teda $5!$. Dostávame počet všetkých rôznych pätíc ako $$\frac{52 \cdot 51 \cdot 50 \cdot 49 \cdot 48}{5 \cdot 4 \cdot 3 \cdot 2 \cdot 1} = \binom{52}{5} = 2598960.$$Pri počte vyhovujúcich pätíc si musíme dať pozor, aby sme nezarátali tú istú päticu dvakrát, keďže ani v počte všetkých možností sme ich tak nerátali. Zvolíme napríklad takúto stratégiu. Vyberieme si hodnosť, z ktorej budeme mať pár, na to máme 13 možností. Z tejto hodnosti máme na výber $\binom{4}{2} = 6$ rôznych kombinácii párov. Vyberieme si zvyšné tri hodnosti, ktoré budeme mať na ruke zo zvyšných 12 hodností, čo je $\binom{12}{3} = 220$. V každej z týchto hodností môžme mať 4 rôzne karty, čo je dokopy $4^3$ možností. Všetky vyhovujúce možnosti získame vynásobením všetkých spomenutých možností.Konečný výsledok teda bude$$\frac{13 \cdot 6 \cdot 220 \cdot 4^3}{2598960} \approx 0.4226$$*Pozn.:* Pri príkladoch takéhoto typu sa dá najviac pomýliť pri opakovanom spočítaní niektorých možností. Treba byť veľmi obozretní. Náš spôsob pravdaže nie je jediný, ako sa tento príklad dá vypočítať.<jupyter_code>cards = list(range(52)) # 52 kariet, 0, ... , 12 su jednej farby, 13 , ... 25 druhej, atd.
def poker_ruka():
    return random.sample(cards, k=5) # bez opakovania

from collections import Counter

def jeden_par(ruka):
    hodnoty = [i % 13 for i in ruka] # rozdelenie na jednotlive hodnoty
    pocty_opakovani = Counter(hodnoty).values()
    return sorted(list(pocty_opakovani)) == [1, 1, 1, 2]
        
N = 100000
sum(jeden_par(poker_ruka()) for i in range(N)) / N<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07688953488372093, 'fraction_numerical': 0.024031007751937984, 'mean_word_length': 4.984633227022325, 'pattern_counts': {'":': 1, '<': 68, '<?xml version=': 0, '>': 71, 'https://': 7, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 9, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '367112', 'license': 'MIT', 'n_tokens_mistral': 9575, 'n_tokens_neox': 9286, 'n_words': 2805, 'path': 'notebooks/00_uvod_do_vsetkeho.ipynb', 'repo_name': 'cedeerwe/slobodna-akademia', 'size': '20640'}