Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
armido15
HV kasutaja

liitunud: 24.12.2010
|
15.10.2013 21:21:02
Monty halli paradoks(programmi loogika,python) |
|
|
Tervist!
Enda huvist koostasin programmi, mis simuleerib monty halli paradoksi.
Küsimus on rohkem programmi loogika, kui mingi errori kohta.
Üritan võimalikult lühidalt teha.
Listis on 3 väärtust[kits*2 ja auto].Kasutaja saab suvalise indexi.
Sealt on edasi 2 varianti
1.Kui see ühtib autoga, siis panen +1 kirja automaatselt muutujasse, kus ta oleks kaotanud ukse vahetamisega.
Teise variandi puhul saan eeldada, et kasutaja on valinud kitse.
2.Eemaldan listist väärtuse, mis ei võrdu autoga ja kasutaja poolt valitud uksega.Ehk, siis eemaldan, kas kitse1 või kitse2.
Alles jääb 2 ust(1 auto ja 2. kitsega.
Vahetan kasutaja valitud ukse indexi ära.
Lõpuks saan teada, mis oleks kasutaja saanud, kui ta oleks ukse vahetanud.
Kood ka, ehk aitab paremini selgitada.
Spoiler 
import random
test = 10000
samauks=0
uus_uks=0
for i in range(test):
uksed = ["kits1"] + ["kits2"] + ["auto"]
random.shuffle(uksed)
valitud=random.randint(0,2)
valitud_uks=uksed[valitud]
kontroll_autoasukohale = uksed[valitud]
if kontroll_autoasukohale == "auto":
samauks+=1
else:
esimene_kits = uksed.index("kits1")
teine_kits = uksed.index("kits2")
if esimene_kits == valitud:
uksed.remove("kits2")
uus_valitud_asukoht=uksed.index(kontroll_autoasukohale)
if uus_valitud_asukoht == 0:
uus_valitud_asukoht=1
if uksed[uus_valitud_asukoht] == "auto":
uus_uks+=1
elif uksed[uus_valitud_asukoht] == "kits1" or uksed[uus_valitud] == "kits2":
samauks+=1
elif uus_valitud_asukoht == 1:
uus_valitud_asukoht=0
if uksed[uus_valitud_asukoht] == "auto":
uus_uks+=1
elif uksed[uus_valitud_asukoht] == "kits1" or uksed[uus_valitud] == "kits2":
samauks+=1
elif teine_kits == valitud:
uksed.remove("kits1")
uus_valitud_asukoht=uksed.index(kontroll_autoasukohale)
if uus_valitud_asukoht == 0:
uus_valitud_asukoht=1
if uksed[uus_valitud_asukoht] == "auto":
uus_uks+=1
elif uksed[uus_valitud_asukoht] == "kits1" or uksed[uus_valitud] == "kits2":
samauks+=1
elif uus_valitud_asukoht == 1:
uus_valitud_asukoht=0
if uksed[uus_valitud_asukoht] == "auto":
uus_uks+=1
elif uksed[uus_valitud_asukoht] == "kits1" or uksed[uus_valitud] == "kits2":
samauks+=1
tulemus=round(uus_uks/(samauks+uus_uks)*100, 2)
tulemus2=round(samauks/(samauks+uus_uks)*100, 2)
print("Sa võitsid",tulemus,"% korda, kuna otsustasid vahetada")
print("Kui sa oleksid jäänud oma uksele kindlaks oleksid võitnud",tulemus2,"%")
|
Oskab keegi ka ideid anda, kuidas programmi automaatsemaks muuta, ehk kuidas saaks ilma suurte täiendusteta näiteks 5 ust oleks ja süsteem toimiks samamoodi ?
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
Dealer14
HV vaatleja
liitunud: 09.02.2004
|
16.10.2013 03:09:56
|
|
|
Su kood on jama ja ei tööta. Aga sellest pole hullu, me kõigi kood on alguses enamvähem sama olnud.
Ma ei aita su koodile funktsionaalsust lisada, vaid ütleksin ära mis on valesti:
Üldiselt tavaks on, et koodi kirjutatakse inglise keeles. See ei ole kivisse raiutud reegel, aga mida varema sa inglise keelele üle lähed seda lihtsam sul endal.
Su kood on läbimõtlemata ja raskesti loetav kordab ennast. Sa kasutad andmetüüpe raiskavalt, ning kordab ennast.
Iseenesest pole hullu, et tulevikus kergem oleks ma kirjutaks sellised märksõnad nagu:
Flowchart, Style Guide for Python Code, Efficient Use of Data Types
Ma kirjutasin su koodi ümber ja püüdsin enamus su vigasid ära parandada.
Kirjutatud Python 2.7-mes
import random
SimulationRounds = 10000
numberOfDoors = 10
switchYourChoice = True
WinCounter = 0
def DoorList():
doorList =[False] * numberOfDoors
rightDoor = random.randrange(numberOfDoors)
doorList[rightDoor] = True
return doorList
def ChosenDoorNumber():
myDoorID = random.randrange(numberOfDoors)
return myDoorID
def DoorSwitch(DoorChoice):
if switchYourChoice:
if DoorChoice:
return False
else:
return True
return DoorChoice
def WinCheck(chosenDoor):
global WinCounter
if chosenDoor:
WinCounter = WinCounter + 1
def MontyHallProblem():
firstDoorChoice = DoorList()[ChosenDoorNumber()]
seccondDoorChoice = DoorSwitch(firstDoorChoice)
WinCheck(seccondDoorChoice)
def Percentage(part, whole):
return 100 * float(part)/float(whole)
def main():
i = 0
while(i < SimulationRounds):
i = i+1
MontyHallProblem();
print WinCounter
print Percentage(WinCounter,SimulationRounds)
if __name__ == '__main__':
main()
|
Aga jah põhiline, et tahtmis ja aega oleks, küll see kood sul ka paremaks muutub.
|
|
Kommentaarid: 22 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
armido15
HV kasutaja

liitunud: 24.12.2010
|
16.10.2013 09:43:00
|
|
|
Ega hetkel on oskused veel kesised.1.kursus Pythonis ja ei ole veel tsüklitest/tingimustes väga kaugemale jõudnud.
Eesti keeles kirjutamine tundub kergem,kui inglise keeles aga eks tuleb ümber õppida, kuna mingil hetkel on see niikuinii vajalik.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andresv
HV kasutaja
liitunud: 06.12.2004
|
16.10.2013 10:54:48
|
|
|
sorry pole pythonit ammu progenud aga, mis kord on global ja kord mitte?
python:
|
def WinCheck(chosenDoor): global WinCounter
|
python:
|
def DoorSwitch(DoorChoice): if switchYourChoice:
|
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
16.10.2013 10:58:54
|
|
|
Ei tea ka Pythonist suurt midagi, aga intuitiivselt pakuks, et alamprogrammid ei saa by default globaalseid muutujaid torkida ja need mida torkida on vaja peab ette ütlema.
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
Dealer14
HV vaatleja
liitunud: 09.02.2004
|
16.10.2013 11:47:21
|
|
|
Mitte päris. Pythonis saavad alamprogrammid globaalseid muutujaid lugeda ja muuta täiesti vabalt.
Antud olukorras kui ma poleks muutujat "WinCounter" määranud globaalseks, tekiks olukord kus python loeks "WinCounter" muutuja kohalikuks.
Millepeale python viskaks veateate, et see muutuja on juba enne "WinCheck" meetodit määratletud.
python:
|
WinCounter = 0 def WinCheck(chosenDoor): global WinCounter if chosenDoor: WinCounter = WinCounter + 1
|
|
|
Kommentaarid: 22 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
16.10.2013 12:02:08
|
|
|
Dealer14 kirjutas: |
Mitte päris. Pythonis saavad alamprogrammid globaalseid muutujaid lugeda ja muuta täiesti vabalt.
Antud olukorras kui ma poleks muutujat "WinCounter" määranud globaalseks, tekiks olukord kus python loeks "WinCounter" muutuja kohalikuks.
Millepeale python viskaks veateate, et see muutuja on juba enne "WinCheck" meetodit määratletud.
|
See ei ole päris korrektne - globaalseid muutujaid saab alati lugeda ja nende meetodeid välja kutsuda, kuid globaalse muutuja nimele ei saa uut väärtust määrata kui muutuja ei ole kohalikus skoobis globaalsena määratletud.
Lisaks - sa viitasid pythoni koodi stiili kohta, kuid endal sul ka kood ei vasta PEP8-le (mitte et see kohustus oleks).
_________________ ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
viimati muutis troglodyte 16.10.2013 15:58:00, muudetud 1 kord |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
Dealer14
HV vaatleja
liitunud: 09.02.2004
|
16.10.2013 12:42:41
|
|
|
Tõsi ta on, et globaalsed muutujad ainult loetavad on(Oleks pidanud enne järgi vaatama, mitte peast laduma).
Su postituse teise osaga ma ei taha nõus olla. Mida sa selle all mõtlesid "Kui sinu koodinäites global WinCounter ära jätta"?
Lisasin siia kaks näidet.
Töötab:
WinCounter = 0
def WinCheck(chosenDoor):
WinCounter = 0
if chosenDoor:
WinCounter = WinCounter + 1
WinCheck(True)
|
Veateatega:
WinCounter = 0
def WinCheck(chosenDoor):
if chosenDoor:
WinCounter = WinCounter + 1
WinCheck(True)
|
Mu erinev koodi stiil tuleneb sellest, et igapäevaselt kirjutan C#. Python on keel millega sai kunagi küll alustatud, aga praegu enam ei kasuta pea üldse.
|
|
Kommentaarid: 22 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
16.10.2013 15:57:11
|
|
|
Dealer14 kirjutas: |
Su postituse teise osaga ma ei taha nõus olla. Mida sa selle all mõtlesid "Kui sinu koodinäites global WinCounter ära jätta"?
|
Sul on õigus - ei süvenenud sinu kirjutatud koodi piisavalt, vabandan. Eemaldasin oma postitusest ebakorrektse info.
_________________ ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
|