Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 3. nädala sisukord | järgmine > |
3.4 Juhuslikust arvust veel
VISKAME TÄRINGUID
Eelmisel nädalal tutvusime juhuslike arvudega, mida saab kasutada näiteks erinevate mänguliste programmide loomisel. Proovime juhuslikkust nüüd tsükliga siduda. Esialgu teeme programmi, mis viskab viis korda täringut. Olgu see tavaline kuuetahuline täring.
from random import randint i = 1 while i < 6: print("Täringu " + str(i) + ". viskel saadi " + str(randint(1, 6)) + ".") i += 1
Kui me midagi muud visketulemusega teha ei taha, siis võimegi selle väljundisse sisse kirjutada. Sageli aga tahame viske tulemusega midagi teha. Näiteks tulemused kokku liita ja kuue saamisel eriliselt rõõmustada.
from random import randint i = 1 tulemus = 0 while i < 6: vise = randint(1, 6) print("Täringu " + str(i) + ". viskel saadi " + str(vise) + ".") if vise == 6: print("Hurraaaaaaaa!") tulemus += vise i += 1 print("Kogutulemus on " + str(tulemus) + ".")
Soovijad võivad täringu nii ümber teha, et täringul oleks mingi muu arv tahke. Näiteks mängus Dungeons & Dragons on ka 4-, 8-, 10-, 12- ja 20-tahulised täringud. Võib ka soovitud tahkude arvu kasutajalt küsida.
KUI TÕENÄOSUSED POLE VÕRDSED
Eelmises näites oli meil täring, mille iga tahk võis tulla võrdse tõenäosusega. Kuuetahulise täringu puhul oli iga tahu tulemise tõenäosus 1/6. Selle tagas funktsioon randint(1, 6)
. Mündiviske puhul saame ausa mündi funktsiooni randint(1, 2)
abil.
Nüüd aga kujutame ette, et keegi on mündiga manipuleerinud ning teinud nii, et kulli ja kirja tõenäosused pole enam võrdsed. Olgu näiteks kirja tulemise tõenäosus 73% (ehk 0,73). Sellise mündi viskamist saab programmiga simuleerida mitmel viisil. Näiteks võiksime kasutada funktsiooni randint(1, 100)
, mis annab võrdse tõenäosusega ühe täisarvu lõigus 1 kuni 100. Saadud arv on 73 või väiksem tõenäosusega 73%. Nii saame järgmise programmi:
from random import randint tõenäosus = 73 i = 0 while i < 10: if randint(1, 100) <= tõenäosus: print("kiri") else: print("kull") i += 1
Kui seda programmi korduvalt tööle panna, siis näeme, et kümnest viskest kipub tõesti kirjasid kullidest rohkem olema. Võite ka kirjade loenduri lisada, mis seda aitab jälgida. Siiski juhtub vahel, et kirjasid on samapalju või vähem kui kulle. Ka see on oodatav.
Samalaadselt saame simuleerida ka teiste tõenäosuslike protsesside tulemusi.
SEIKLUS METSAS
Järgmine programm on eelnevatest pikem ja simuleerib võimalikku jalutuskäiku metsas. Hoiatus! Tegemist on metsaga, kus leidub nii ohte kui ahvatlusi. Soovitame aga siiski katsetada. Ennekõike aga püüdke programmist aru saada.
from random import randint elusid = 3 münte = 0 while elusid > 0: print("Jalutasid metsas ja nägid ", end = "") # ei vaheta rida kedaMida = randint(1, 3) if kedaMida == 1: print("seent", end = "") # ei vaheta rida if randint(1, 2) == 1: print(", mis kahjuks oli mürgiseen ja sa kaotasid ühe elu.") elusid -= 1 else: print(", mis õnneks oli söögiseen ja sa said tema müügist ühe kuldmündi.") münte += 1 elif kedaMida == 2: print("karu", end = "") # ei vaheta rida if randint(1, 2) == 1: print(", kes kahjuks oli vihane ja sa kaotasid ühe elu.") elusid -= 1 else: print(", kes õnneks oli rõõmus ja sa said temalt 5 kuldmünti.") münte += 5 else: print("kuldmünti ja said selle endale.") münte +=1 print("Nüüd on sul " + str(elusid) + " elu ja " + str(münte) + " kuldmünti.") input("Jätkamiseks vajuta Enter-klahvi.") print("Sellega on su seiklus kahjuks läbi.")
Soovitatav on püüda seda programmi täiendada. Näiteks teha nii, et
- teatud müntide arvu juures kuulutatakse mängija võitjaks. Hetkel on selgelt letaalse seiklusega tegemist;
- ohte või ahvatlusi oleks rohkem;
- elu kaotamise tõenäosus oleks väiksem;
- ka kasutaja saaks saatuse määramisel kuidagi kaasa lüüa.
Võite ka ise veel täiendusi juurde mõelda.
Ülesanne
< eelmine | 3. nädala sisukord | järgmine > |