Simulátor Monty-Hallova paradoxu

C# .NET WPF Zdrojákoviště Simulátor Monty-Hallova paradoxu

Jedná se o simulátor tzv. Monty-Hallova paradoxu, což je jistý matematický pravděpodobnostní problém, který doopravdy vůbec není paradoxem. Dovolím si prezentovat několik slov z wikipedie:

Veskrze poctivý moderátor umístil soutěžní cenu – auto – za jedny ze tří dveří. Za každými ze zbývajících dveří je cena útěchy – koza. Úkolem soutěžícího je zvolit si jedny dveře. Poté moderátor otevře jedny ze dvou zbývajících dveří, ale jen ty, za nimiž je koza. Teď má soutěžící možnost buď ponechat svou původní volbu, nebo změnit volbu na zbývající dveře. Soutěžící vyhrává cenu, která je za dveřmi, které si zvolil. Soutěžící nemá žádné předchozí znalosti, které by mu umožnily odhalit co je za dveřmi. Nechť soutěžící nejprve zvolí dveře číslo 1. Nechť moderátor otevře dveře číslo 3, za kterými je koza. Zvýší se šance na výhru auta, pokud soutěžící změní volbu na dveře číslo 2?

Jedná se o to, že pokud ve druhém kroku zvolíte druhé dveře než v tom prvním, máte dvojnásobnou šanci na výhru. Lidem se tomuto zpravidla nechce uvěřit, vždyť přece nakonec stejně vybírají ze dvou dveří, opak je ale pravdou. Tím že původně vybíráte ze dvou koz, máte šanci 2/3 na kozu. Když po té moderátor druhou kozu odhalí, jste na 66% na koze a přechodem k druhým dveřím dojdete na 66% k autu. Plné vysvětlení je v citovaném článku na wikipedii.

V aplikaci najdete stejnou hernu se třemi dveřmi a počítadlo výher a proher, kde si sami můžete zkusit zahrát a uvidíte, že se správnou strategií vyhrajete ve zhruba 66% případů. Dále můžete spustit automatický režim, kdy za vás automat stanovenou rychlostí udělá stanovený počet pokusů a bude se při tom řídit stanovenou strategií.

Ovládání je myslím intuitivní, pokud budete cokoli potřebovat vědět, ať už o problému či o aplikaci samotné, stiskněte tlačítko "Info" (nebo na klávesnici F1).

Při tvorbě aplikace jsem se snažil držet se zásad OOP a MV. Využil jsem Binding (a MultiBinding), DispatcherTimer, Vyvolávání dialogů, Read-Only Vlastnosti.

Máte-li někdo připomínku či podnět pro vylepšení aplikace, napište to prosím určitě do komentářů, mohu vydat novou verzi ;) Zdrojové kódy jsou v češtině, vč. okomentování.

Changelog

Verze 1.3.i

  • Opraven bug, který způsoboval, že se při resetu statistik nevynuloval počet manuálně zahraných her
  • Pokud nyní při exportu dojde k chybě ve výpočtu (např. kvůli přetečení některé hodnoty), v exportovaném souboru nepřibyde neúplná statistika
  • Přepracována třída Exporter, je nyní přehlednější a snadno modifikovatelná
  • Přidána automatická detekce používané strategie při manuálním hraní
  • Přidány statistiky (pro export) týkající se poměrů mezi hrami s vítěznou a s proherní strategií - program vypočte očekávaný poměr (poměr vycházející ze statistiky) na základě počtů her zahraných vítězně a proherně
  • Statistiky jsou nyní úplné, tedy nematou např. kvůli změně strategie během hraní

Verze 1.2.i

  • Doplněny aktuální obrázky
  • Opraven binding historie auta
  • Přidán export statistik. Tlačítko "Exportovat statistiky" nyní zapíše statistiky o provedených hrách do souboru Monty-Hall-Stats.txt, umístěném ve výchozí složce pro dokumenty
  • Přidán kompletní popisek Progress Baru
  • Reset statistik se nyní ptá ujištovacím dialogovým oknem
  • Spuštění automatického režimu nyní zakryje všechna tlačítka
  • Tlačítko "Nastavení automatického režimu" nyní změní svůj popisek při spuštění automatu
  • Zdrojové kódy plně okomentovány (ještě lépe)

Verze 1.1.i

  • Korektně doplněn soubor AssemblyInfo.cs
  • Opraveno zalamování textu v komentářovém textblocku
  • Přidány dvě nové statistiky - poměr mezi výhrami/prohrami a historii umístění auta
  • Přidán Progress bar pro postup automatu
  • Přidány tooltipy k většině kontrolek
  • Přidán uvítací text, který se v moderátorově komentáři zobrazí po spuštění aplikace
  • Stisknutí klávesy F1 nyní vyvolá info okno
  • Upraven informační text
  • Upravena vzájemná pozice některých elementů
  • Zdrojové kódy plně okomentovány

Galerie

Program byl vytvořen v roce 2016.

 

Stáhnout

Staženo 49x (733.84 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (12)

Program pro vás napsal krepsy3
Avatar
Autor se učí programovat zde na itnetworku, zatím zejména jazyk C#. Znalosti chce mít ucelené, proto při vývoji aplikací studuje potřebné funkce do hloubky. Vyzná se v programování ve hrách, jako je Minecraft či Ricochet.

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 



 

 

Komentáře
Zobrazit starší komentáře (1)

Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Aplikace pěkná, ale spíše mám větší radost z toho, že jsem se seznámil s Monty Hall Paradoxem. :)

 
Odpovědět  +5 14. srpna 10:22
Avatar
krepsy3
Redaktor
Avatar
Odpovídá na nalimleinad
krepsy3:

Je to zajímavý problém, že? ;) Táta s tím jednou přišel domů, a já hned, že: "No, asi bych si nechal ty původní, abych nebyl naštvanej, když by to pod nima bylo." :D

Mimochodem, jsi spokojený s info oknem, nebo bys něco napsal jinak (nesedí ti to slohově)? Teď pracuju na v1.2, tak bych to mohl změnit ;)

Odpovědět 14. srpna 18:14
Programátor je stroj k převodu kávy na kód.
Avatar
nalimleinad
Člen
Avatar
Odpovídá na krepsy3
nalimleinad:

Jsem na tom stejně. Hlavně dokud jsem tuto problematiku neviděl při vysvětlování se 100 dveřmi, nebyl jsem schopen to pochopit, protože jsem si automaticky v hlavě přetvořil zlomek z třetin na poloviny a potom mi šance vycházela stejná, jak to dělá asi většina lidí.

Předtím jsem nevěnoval moc velkou pozornost textu v info okně, ale myslím, že základ problematiky je v něm vysvětlený dobře. Já koukal na video https://www.youtube.com/watch?… které mi přijde super, jak krásně visuálně vysvětluje pravděpodobnosti.

EDIT: Mimochodem trošičku mi to připomíná takové to smýšlení při ruletě, že když padne 30x po sobě červená, je poté větší pravděpodobnost, že padne černá (pokud nebereme v potaz 0).

Editováno 14. srpna 19:48
 
Odpovědět  +1 14. srpna 19:45
Avatar
krepsy3
Redaktor
Avatar
Odpovídá na nalimleinad
krepsy3:

Jé, Numberphile, na ty koukám, ale tohle jsem neviděl. Ten příklad se 100 dveřma je cool :D, když jsem ho poprvé viděl (táta se to snažil ilustrovat také na něm), tak jsem říkal "jasně, otevře 66 dveří" :D

Odpovědět 14. srpna 20:50
Programátor je stroj k převodu kávy na kód.
Avatar
coells
Redaktor
Avatar
Odpovídá na krepsy3
coells:

Jestli tě tohle baví, tak můžeš zkusit ukázat jinou úlohu, která také vede k překvapivému výsledku.

Skupina lidí v místnosti zjišťuje, jestli alespoň dva lidé ve skupině mají narozeniny ve stejný den (bez ohledu na rok).
Za předpokladu, že šance narodit se v určitý den je stejná jako v libovolný jiný den (což v reálu není pravda), jak velká musí být skupina, aby měli alespoň 50% šanci na nalezení takového páru?
Jinými slovy, kolik lidí musíš mít v místnosti, abys měl alespoň poloviční šanci na nalezení páru, který bude slavit ve stejný den?

Zjistit to můžeš simulací Monte Carlo, která je podobná tomu, co už děláš.
Do místnosti umístíš K lidí s náhodnými dny narození, a zkusíš najít narozeninový pár.
To zopakuješ hodněkrát dokola a výsledný poměr (nalezené místnosti)/(všechny místnosti) je pravděpodobnost pro K.
Celý pokus pak opakuješ pro různá K, abys našel pravděpodobnosti.

Možná to zní složitěji, než to je, ale výsledek docela stojí za to.

 
Odpovědět  +1 14. srpna 21:44
Avatar
krepsy3
Redaktor
Avatar
Odpovídá na coells
krepsy3:

O tom jsem už slyšel, stačí tuším asi 32 lidí, aby byla pravděpodobnost 50% a 56 na 90%

Jenže si říkám, že to je počítačem nenasimulovatelné, protože to počítá s demografickými daty, tzn. že některé dny v roce se narodí nezanetbatelně méně dětí než v jiné dny.

Mimochodem, co je simulace Monte Carlo? Ale díky za tip, poslední dobou hledám inspiraci, co dělat ;)

Odpovědět 15. srpna 8:14
Programátor je stroj k převodu kávy na kód.
Avatar
Honza
Člen
Avatar
Honza:

Dovolím se lehký offtopic, ti co to znají nechť tento příspěvek přeskočí :) Kdo je hračička a chtěl by si takovéto věci nasimulovat, doporučuji mu software NetLogo. Je to free software a je tam spoustu příkladů včetně zdrojových kódů, ze kterých se dá simulace okoukat. Používá se tam velice jednoduchý skriptovací jazyk, který má v sobě funkce pro generování náhodných čísel dle zadaných kritérií. Navíc jde daný model spustit několikrát paralelně s různými parametry. Můžete to nechat běžet klidně několik hodin nebo dní a pak si nechat do csv vyexportovat výsledky, popř. i mezivýsledky z jednotlivých kroků. Pokud jste nadšení hračičkové a máte dost volného času, vřele doporučuji. Dá se s tím dobře vyblbnout :)

Editováno 15. srpna 9:15
Odpovědět 15. srpna 9:14
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
coells
Redaktor
Avatar
Odpovídá na krepsy3
coells:

Pokud distribuci dnů zanedbáš, dají se pravděpodobnosti spočítat přímo, viz obrázek v příloze.
Osa X je velikost skupiny, osy Y pravděpodobnost kolize.
Btw, tvoje odhady velikosti skupiny jsou dost nadhodnocené.

Pokud ji zanedbávat nechceš, pak se provádí simulace, abys pravděpodobnosti zjistil.
V případech, kdy by to bylo hodně složité počítat, je simulace nejjednodušší řešení.
Monte Carlo je typ simulace, kterou jsem ti popsal v předchozím příspěvku.

 
Odpovědět 15. srpna 9:30
Avatar
krepsy3
Redaktor
Avatar
Odpovídá na coells
krepsy3:

Co to je? Nějakej MatLab nebo něco takového? Jinak ano, odhady jsem nadhodnotil, protože jsem si je přesně nepamatoval :D Ale při 23 lidech je v místnosti 253 dvojic, dní v roce je 365, tak to vyjde.

Odpovědět 23. října 21:23
Programátor je stroj k převodu kávy na kód.
Avatar
coells
Redaktor
Avatar
Odpovídá na krepsy3
coells:

Něco takového, je to R.

 
Odpovědět 24. října 11:24
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 11. Zobrazit vše