FANDOM


Ez egy szabadon bővíthető keretprogram valószínűségi szimulációk készítésére. Használható szemléltetésre, hitetlen tanulók meggyőzésére, a keresett eredmény megsejtésére, valamint programozásra. :-) Egyszerűen írjuk meg a kívánt szimulációt a meglévők mintájára, a program pedig megkérdezi a lépésszámot, és kiírja a kedvező esetek relatív gyakoriságát százalékban, valamint a futásidőt. Figyeljük meg, hogy a beállítások() függvény egy másik függvény nevét adja vissza, amelyet a főprogram az eval() függvény felhasználásával hívhat meg.

Néhány érintett programozási témakör: szótár, lista, halmaz, ciklus, break / continue / pass, kivételkezelés, kerekítés, képernyőtörlés, standard könyvtár, rendezés, véletlenszámok, feltételes kifejezés, többszörös feltételvizsgálat, docstring, időmérés.

Check.svg Tesztelve a 3.1.2 verzióban.

"""
Ez a keretprogram néhány valószínűségszámítási szimulációt végez.
Az elején megadott játék és lépésszám az alapértelmezés, de meg is kérdezi.
A minta alapján bővíthető. Az új függvényt vedd fel a JÁTÉKOK szótárba is.
A global kulcsszót akkor kell használnunk, ha a globális változó értékét
egy függvényen belül módosítani akarjuk. (Ha csak olvassuk, akkor nem.)

Ez a 2.0 változat bemutatja, hogyan lehet a docstringek segítségével súgót 
kérni az egyes függvényekről. Ez ugyan szebb és elegánsabb lenne objektum-
orientált változatban, de fontosabb szempont volt, hogy a középiskolai tananyag
keretei között maradva oldjam meg, amit lehet. A megoldás azonban kihasználja,
hogy a Pythonban a színfalak mögött minden objektum, így a függvények is.

A docstringek szándékosan vannak eltérő behúzással megadva, hogy a program
bemutassa a lehetőségeket. A nagyobb_szám() behúzott docstringje olvashatóbb
kódot, a hatoskocka() behúzatlan súgója pedig szebb kiírást eredményez.
Az idézőjelek között az általános behúzási szabály nem érvényes!
(Ld. még a beállítások() függvényt is.)

A beállítások() függvényben kétféleképp ellenőrizzük a szótárkulcs létezését:
a súgó kiírásánál elágazással, a játék kiválasztásánál pedig kivételkezeléssel.

TODO: 
– megoldani a játékok kiírását, ha több van, mint amennyi a képernyőre fér
– 9-nél több játék esetén a kulcsok szerint rendezést kicsit módosítani kell
"""

#Az alapértelmezések:
#Ne adj meg nullát, nem fogom bohóckodásért lekezelni.
SZIMULÁCIÓS_LÉPÉSSZÁM=20000 #Alapértelmezés
játék="hatoskocka"

import random, time

JÁTÉKOK={ 
    #Példa a szótár (asszociatív tömb) adattípus használatára.
    #Ha túl sok játékod van, és nem fér a képernyőre, át kell írni
    #a beállítások függvényben a kiírást!
    #A kulcs lehetne szám is, de az még egy konverziót + hibakezelést igényelne.
    #At utolsó után is van vessző, így nem felejtjük le a bővítésnél!
    '1': 'hatoskocka',
    '2': 'nagyobb_szám',
    '3': 'terc',
}

def clr():
    #Lásd a Képernyőtörlés szócikket
    import os, platform
    if platform.system() == 'Windows':
        os.system('cls')
    else:
        os.system('clear')

def beállítások():
    global játék,db
    clr()
    #A súgó miatt ciklusba tesszük a beolvasást:
    while True:
        print("A rendelkezére álló kódok a hozzájuk tartozó játékokkal:")
        #A következő sor azért kell, hogy sorban írja ki a kulcsokat.
        #A szótár ugyanis nem garantálja a beírás szerinti sorrendet.
        for kulcs in sorted(JÁTÉKOK.keys()):
            print(kulcs, JÁTÉKOK[kulcs])
        print("\nAz alapértelmezés:", játék)
        print("Ha súgót szeretnél valamelyik játékról, írj a szám elé egy h \
betűt (pl. h2)!")
        melyik=input(
          "Melyiket játsszuk? (Kódot írj, vagy entert az alapértelmezéshez.) ")
        if melyik.lower().startswith('h') and melyik[1:] in JÁTÉKOK:
            #Ez most bonyolultnak látszik, mert ki kell keresnünk a játékot,
            #de általában elég a függvény neve után írni a ".__doc__"-ot.
            #A melyik[1:] leveszi a h vagy H kezdőbetűt.
            print(eval(JÁTÉKOK[melyik[1:]]).__doc__)
            continue #Újrakezdi a ciklust.
            #Bármilyen hiba esetén rácsorog a játék kiválasztására.
        try:
            játék=JÁTÉKOK[melyik]
        except KeyError:
            pass #Nincs teendő, marad az alap, csak kezeljük a hibát.
        print("\nAz alapértelmezés",SZIMULÁCIÓS_LÉPÉSSZÁM,
              "lépés (ehhez az entert nyomd).")
        try:
            db=int(input("Hány lépésig menjünk? "))
            if db<1:
                db=SZIMULÁCIÓS_LÉPÉSSZÁM
        except ValueError:
            db=SZIMULÁCIÓS_LÉPÉSSZÁM
        break #Ciklus vége

def arány(egyik, másik):
    #Egy tized százalékra kerekítünk padlós osztással.
    #A %.1f egy tizedesre formázza, sok kóbor 0 nélkül.
    x=(egyik/másik*1000+0.5)//1
    x/=10
    return "%.1f" % x +"%" #A % jelet nem szereti a stringen belül.

# --------------- Itt kezdődnek a tényleges szimulációk ---------------

def hatoskocka():
    """
Hatos dobás klasszikus dobókockával
    """
    global count
    for i in range(db):
        count+=1 if random.randint(1,6)==6 else 0

def nagyobb_szám():
    """
    Peti gondolt egy számra 1 és 10 között, és leírta. 
    Laci is gondolt egy számra 1 és 10 között, és ő is leírta. 
    Mi a valószínűsége, hogy Peti száma nagyobb, mint Lacié?
    http://www.gyakorikerdesek.hu/kozoktatas-tanfolyamok__hazifeladat-kerdesek__1405560
    """
    global count
    for i in range(db):
        Peti=random.randint(1,10)
        Laci=random.randint(1,10)
        if Peti>Laci:
            count+=1

def terc():
    """
    Egy pakli francia kártyából (joker nincs benne) kihúzunk öt lapot. 
    Mi a valószínűsége, hogy van benne egyszínű terc?
    (Az ász-2-3 és a dáma-király-ász egyaránt tercnek számít!)
    """
    global count
    def hármas(lap):
        #A % operátor az osztás maradékát adja, mint a C-ben.
        if 0<lap%13<12 and lap+1 in lista and lap+2 in lista: #Max. bubi az első
            return True
        elif lap%13==12 and lap+1 in lista and lap-11 in lista: #D-K-Á
            return True
        else:
            return False
    for i in range(db):
        #A színeket egymás után rakjuk, 4*13=52 lapból kell sorsolni.
        #Minden színnél az 1 jelzi az ászt. Így a legegyszerűbb.
        #Halmazba tesszük, mint a Lottószámok cikkben, kétszer ne húzzuk ki.
        halmaz=set()
        while len(halmaz)<5:
            halmaz.add(random.randint(1,52))
        lista=sorted(list(halmaz))
        for lap in lista:
            if hármas(lap):
                #print(lista)
                count+=1
                break #Fontos, hogy a 4-5-ös sorozatokat ne számolja többször!

random.seed() #Inicializálás
count=0
db=SZIMULÁCIÓS_LÉPÉSSZÁM
beállítások()
print("\nA játék:",játék)
#Időmérés: http://docs.python.org/py3k/library/time.html
start=time.clock()
#Most az eval függvénnyel kiválasztjuk és lefuttatjuk a játékot, így lehet 
#átvenni egy függvény nevét.
eval(játék)()
stop=time.clock()
#A futásidőt 3 tizedesre írjuk ki. 
#A kivonást zárójelbe tesszük, mert a % erősebben köt. Másképp hibával áll le.
print("Futásidő: %.3f másodperc." %(stop-start))
print (db,"lépés után az arány:",arány(count,db))

Ez a szócikk forráskódot tartalmaz, amely egy WikiMedia-kiegészítés segítségével olyan színesen jeleníthető meg, mint például ebben a Wikipédia-cikkben. A kiegészítést a Wikia-stáb ígérete szerint 2010 végéig frissítik, addig türelmet kérünk a fapados kinézet miatt.

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

A Wikia-hálózat

Véletlen wiki