Valószínűségszámítás programozási feladatok (BMETE91AM46/T1)

Oktató: 
Tantárgy követelmény: 
Kurzus típus: 
Gyakorlat
Nyelv: 
magyar
Félév: 
2017/18/1

A tárgy célja a Valószínűségszámítás 1 című tárgy tematikájához kapcsolódó programozási feladatok megoldásán keresztül a hallgatók programozási képességeinek szinten tartása, és egyúttal a valószínűségszámítás alapfogalmainak véletlen események szimuláción keresztül való jobb megértésének elősegítése.

A tárgy 1 kredites, ami összesen 30 óra, azaz heti 2-3 óra programozási munka elvégzését kívánja. Olyan feladatokat igyekszünk adni, melyek érdekesek lesznek mindenki számára, és amelyek megoldása sok haszonnal fog járni. A feladatok száma 12, összpontszáma 50. Követelmény a feladatok határidőre való leadása (illetve a pontszám 20%-ának elvesztése mellett legföljebb 1 héttel későbbi, késedelmes leadása) és a feladatokra kapható maximális összpontszám legalább 50%-ának elérése. A hibásan megoldott feladat az eredmény kihirdetése utáni 1 héten belül javítható. A feladatok megoldását a valszam.prog@gmail.com címre csatolmányként kell elküldeni, külön fájlban a Python programkódot, és ha van, külön fájlban az adatokat. A programfájl neve a feladat sorszámával kezdődjön, folytatásul a hallgató neve legyen szóközök nélkül, pl. Kovács Jutka 5-dik házi feladatát 5KovacsJutka.py, adatfájlját 5adatKovacsJutka.txt néven küldje el. Ha Python3-ban oldja meg, a program nevének vége 3 legyen, példánkban 5KovacsJutka3.py. Minden házi feladat kísérő levelébe az alábbi szöveget kell írni:

E programot magam kódoltam, nem másoltam vagy írtam át más kódját, és nem adtam át másnak.
Kovács Jutka

Az, hogy az otthoni feladat kódját mindenkinek magának kell beírnia, programkódot átadnia, mástól kérnie és elfogadnia nem szabad, nem zárja ki az együtt gondolkodás vagy a segítségkérés lehetőségét! Konzultáció is kérhető, személyes is.

Tartalomjegyzék

  1. Monthy Hall háromajtós problémája (5 pont)
  2. Szentpétervári paradoxon (3 pont)
  3. Binomiális eloszlás (6 pont)

Feladatok

1. feladat: Monthy Hall háromajtós problémája (határidő 2017-09-20 szerda 24:00, 5 pont)

  • Egy egykori televíziós játék (USÁ-ban Let's Make a Deal volt a címe és Monthy Hall volt a műsorvezető, Magyarországon Zsákbamacska néven futott) utolsó fázisában a játékost 3 csukott ajtó elé állítják, melyek egyike mögött egy értékes jutalom (pl. gépkocsi) van, míg a másik kettő mögött valami értéktelen. A játékos kiválaszt egy ajtót, de mielőtt azt kinyitnák, a műsorvezető a másik két ajtó közül egyet kinyit megmutatva, hogy nem ott van az értékes ajándék, és fölajánlja a játékosnak, hogy még meggondolhatja magát és megváltoztathatja a döntését, választhatja a másik ajtót. A kérdés az, hogy ilyenkor mit érdemes tennie a játékosnak:
    1. tartson ki eredeti döntése mellett, vagy
    2. változtassa meg döntését, vagy
    3. mindegy, pl. 0.5 valószínűséggel kitart eredeti döntése mellett, 0.5 valószínűséggel megváltoztatja.

    Írjunk programot, mely szimulálja e játékot 3000-szer. A program

    1. véletlen módon jelöljön ki egy ajtót, amely mögött az értékes ajándék van,
    2. a játékos szerepében véletlenül válasszon egy ajtót (nem tudva az előző választásról),
    3. a műsorvezető szerepében (véletlenszerűen) válasszon egy ajtót, mely különbözik a játékos által választottól és amely mögött nem az értékes jutalom van,
    4. a játékos szerepében a 3000 eset közül az első 1000-ben maradjon meg az eredeti döntése mellett, a második 1000 esetben változtassa meg döntését, a harmadik 1000 esetben 0.5 valószínűséggel változtasson eredeti döntésén, végül
    5. eredményül írjuk ki a játékos nyerésének relatív gyakoriságát mindhárom esetben szóközzel elválasztva.
  • A feladat célja: a relatív gyakoriság szimuláción keresztül való megtapasztalása és a feltételes valószínűség fogalmának előkészítése egy paradoxonnak tűnő problémán keresztül.
  • Programozási cél: szimuláció programozása, véletlen szám generálása, ciklus írása.
  • Segítség: a random csomag betöltésével (import random) és a random.random() hívással egy 0 és 1 közé eső véletlen számot kapunk (egyenletes eloszlás szerint). Az int(random.random()*3) hívás a 0, 1 vagy 2 értéket adja vissza.
  • A Python 2-ben – mi ezt tanultuk – egészek osztása egész eredményt ad. Python 3-ban ez megváltozott. Python 2-ből kérhetőek a jövő (a 3-as) egyes új tulajdonságai, például az osztás e tulajdonsága megváltoztatható a kód elejére írt from __future__ import division paranccsal.
  • A feladat a példatárban 2.20 sorszámmal szerepel.

2. feladat: Szentpétervári paradoxon (határidő 2016-09-27 szerda 24:00, 3 pont)

  • Egy érmével addig dobunk, míg a fej oldalára nem esik. Ha ez az \(n\)-edik feldobáskor történik meg, akkor a játékos \(2^n\) forintot nyer (ld. Wikipédia). Szimuláljunk \(m\) játékot (azaz \(m\) fej dobásig játszunk). Mennyi a nyeremény átlaga \(m=100\), \(m=10000\) és \(m=1000000\) esetén?
  • A program kimenete e három átlag szóközzel elválasztva.
  • A feladat célja egy végtelen várható értékű valószínűségi változóval való tapasztalatszerzés.
  • A feladat a példatárban 3.21 sorszámmal szerepel.

3. feladat: Binomiális eloszlás (határidő 2016-10-04 szerda 24:00, 6 pont)

  • Az e heti feladatban három oszlopdiagramot kell kirajzolni egyetlen ábrában. Az első ábra egy \((n,p)\) paraméterű binomiális eloszlás valószínűségeloszlását mutatja, a második ábra e binomiális eloszlást szimulálva tapasztalati valószínűségeloszlást mutat, míg a harmadik ábra a binomiális eloszlást közelítő \(\lambda=n\cdot p\) paraméterű Poisson-eloszlás valószínűségeloszlásának első \(n+1\) oszlopát ábrázolja.
  • A program eredményeként valami hasonló ábrát fogunk kapni (a színek, skálázás,... nem lényeges része a feladatnak):
  • A program bemenete \(n\), \(p\), \(k\), ahol \(n\) és \(p\) a binomiális eloszlás paraméterei, és \(k\) a szimulációk száma. A program például parancssorból így indítható:
    python 3KovacsJutka.py 12 0.3 1000

    vagy Python 3 esetén:

    python3 3KovacsJutka3.py 12 0.3 1000

    Ehhez a sys modult kell betölteni, ekkor az első paramétert a sys.argv[1] tartalmazza karakteres formában, tehát számoláshoz még konvertálni kell. (A kész programot futtassuk le különböző számhármasokon, pl. 20 0.05 100040 0.02 1000 vagy 40 .5 1000.)

  • A binomilás eloszlás értékeinek listájához a binomiális együtthatókra szükség lehet, amihez a math modul használható. Az első ábrán oszlopdiagramokkal ábrázoljuk a valószínűségeloszlást.
  • A binomiális eloszlás szimulációja megvalósítható úgy, hogy $n$ kísérletet végzünk egy $p$ valószínűségű esemény bekövetkezéseinek számára. A valószínűségi változó értéke $m$, ha az esemény az $n$ kísérletből $m$-szer következett be. Ezt az $n$ kísérletet $k$-szor megismételjük, így a valószínűségi változó $k$ értékét kapjuk. A második diagram $m$-edik oszlopa $i/k$ magas legyen, ha a valószínűségi változó $i$-szer vette föl az $m$ értéket. (A feladat e pontja egyszerű ciklusokkal és a random modul random függvényével megvalósítható, de a numpy.random.binomial függvény is használható.)
  • A harmadik ábra egy Poisson-eloszlású $X$ valószínűségi változó első $n+1$ értékét mutatja, ahol \[ P(X=m)=\frac{\lambda^m}{m!}e^{-\lambda}, \quad m=0, 1, 2,\dots, \] ahol $\lambda=np$.
  • Az ábrák kirajzolásához a matplotlib csomag használható. Érdemes egy kis időt eltölteni megismerésével: nagyon egyszerűen használható. Betöltése a import matplotlib.pyplot as plt paranccsal történik, ami után
    plt.bar(lista1,lista2,oszlopszelesseg) 
    plt.show()
    

    egy olyan oszlopdiagramot rajzol ki, ahol az oszlopok bal alsó sarkának $x$-koordinátája a lista1-ben, az oszlopok magassága a lista2-ben, az oszlopok szélessége az oszlopszelesseg változóban van. Ha három részábrát akarunk egyben ábrázolni, akkor az első előtt egy

    plt.subplot(311)

    parancsot kell kiadni, ahol a 311 jelentése: 3 sorban 1 oszlopban az első részábra jön. A következőbe 312, az utolsóba 313 kerül. (E három részdiagram „hasonlítani fog egymáshoz”.)