☠ 10. Péksütemény

Véletlen számok-II

Írj egy olyan függvényt, melynek bemeneti értéke a p valószínűség (mely egy 0 és 1 közötti szám), kimeneti értéke pedig p valószínűséggel a "kakaós csiga" string, 1-p valószínűséggel pedig a "túrós táska" string. Demonstráld hisztogram segítségével, hogy a függvényed helyes eloszlással generálja a kívánt péksüteményeket!

Megoldás

Mivel használni fogjuk, a funkcióit, hívjuk meg a pylab csomagot!

In [2]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib

Először készítsük el a kérdéses függvényt! A véletlen funkciót a random.randint függvény biztosítja, ami egy egész számot ad egy bizonyos intervallumban, ehhez azonban az kell, hogy p értéke egész legyen, ezért addig szorozzuk, amíg az nem lesz, így viszont a valószínűség maximális értékét is szorozni kell egy szorzo nevű változóban. Egy p valószínűségi esemény akkor következik be, ha a kapott véletlen egész szám kisebb, mint a módosított p.

In [3]:
def peksuti(p):
    szorzo = 1                           # kell egy viszonítási alap, amihez képest p hányadosa egy adott érték
    while int(p) != p:                  # p-t addig kell szorozni, amíg egész nem lesz
        p *= 10                          # de hogy a p/szorzo arány ne változzon, mindkettőt szorozzuk
        szorzo *= 10
    if random.randint(0, szorzo) < p:    # Mivel a p/szorzo hányados az eredeti kapott valószínűséggel egyenlő, a feltétel teljesülésének valószínűsége is ennyi
        return "kakaós csiga"
    return "túrós táska"

Ezután elkészítjük az ellenőrző hisztogrammot. Veszünk egy 0 és 1 közötti random számót a random.rand() függvénnyel, majd lefuttatjuk 100-szor a peksuti függvényt, ezen valósínűség mellett. Azt, hogy hányszor kaptuk az egyik illetve a másik szót, hisztogrammon ábrázoljuk a bar() függvénnyel.

In [39]:
stat = {"kakaós csiga":0, "túrós táska": 0}                                  # Az eredmények gyakoriságát a stat szótárban tároljuk.
p = random.rand()
for i in range(0,100):
    stat[peksuti(p)] += 1                                                    # 100-szor lefuttatjuk a függvényt, és az eredményt rögzítjük.
print("valószínűség: " + str(p))
for s in stat:
    print(s + " gyakorisága: " + str(stat[s]))                               # Kiiratjuk a kapott statisztikát, és összehasonlítjuk a várakozással
print("Kakaós csigák várt értéke: " + str(p))
print("relatív hiba: "+ str(((stat[s]/100 - p)/p)*100) + "%")
    
bar(range(0, len(stat)), list(stat.values()), align="center", width=0.35)    # Készítünk egy hisztogrammot a stat szótár értékeinek felhasználásával.
xticks(range(0, len(stat)), list(stat.keys()))
ylabel("gyakoriság")
show()
valószínűség: 0.3731806273585926
túrós táska gyakorisága: 65
kakaós csiga gyakorisága: 35
Kakaós csigák várt értéke: 0.3731806273585926
relatív hiba: -6.211637383930473%

Az előző eljárást többször lefuttatva láthatjuk, hogy nagyjából jól működik a függvény.

In [9]:
for s in stat:
    print(s)
túrós táska
kakaós csiga