Monty Hall problema arba kaip praturtėti
Parašė: Tadas, 2009-01-24
Kategorijose: Smagumynai

Nepraleiskite straipsnio – galbūt šios žinios jums kada nors uždirbs krūvą pinigų :].
Tarkime, dalyvaujate žaidime. Prieš jus 3 durys (žr. iliustraciją viršuje). Už vienų iš jų (tarkime #2) yra automobilis, už kitų dvejų ožkos (#1 ir #3). Tarkime, jūs pasirenkate #1 duris. Vedėjas atidaro duris, už kurių yra ožka (#3), ir siūlo jums pakeisti jūsų pasirinkimą. Klausimas: ar jūs turite daugiau šansų laimėti automobilį pasilikdami prie savo spėjimo, ar pakeitę jį?
Atrodytų, renkantis vieną iš dviejų variantų šansai yra lygūs – juk bet kuriuo atveju nežinome, už kurių durų yra automobilis. Bet pasirodo ne – pakeitus savo spėjimą tikimybė laimėti automobilį yra 2/3, o pasilikus su savo spėjimu – tik 1/3.
Kodėl? Pasilikdamas su savo pirmu sprendimu jūs laimėsite tik tuo atveju, jei iškart pasirinkote automobilį, t.y. šansai lygūs 1/3. Atitinkamai šansų pasirinkti vieną iš ožkų yra 2/3. Pasirinkę ožką ir pakeitę savo spėjimą jūs laimėsite. Kadangi tikimybė pasirinkti ožką yra 2/3, todėl ir tikimybė laimėti pakeitus spėjimą yra 2/3.
Neįtikinau? Nieko baisaus. Parašiau skriptą, kuris simuliuoja žaidimą ir skaičiuoja, ar iš tiesų šansų laimėti pakeičiant savo sprendimą yra daugiau.
<?php
/*
Tadas Syčiovas, 2009
http://laisvai.net
-----
Monty Hall Problem simuliacija
http://en.wikipedia.org/wiki/Monty_Hall_problem
*/
$staying=0;
$switching=0;
//kiek kartų kartoti žaidimą?
$count=100000;
for ($i=0;$i<=$count;$i++) {
$choises=array('goat', 'goat', 'car');
shuffle($choises);
$user_choise=rand(0, 2);
//vedėjas atidaro vienas duris. tai negali būti žaidėjo pasirinktos durys arba durys, už kurių stovi automobilis
for ($a=0;$a<=2;$a++) {
if ($a!=$user_choise and $choises[$a]!='car'){
unset($choises[$a]);
}
}
//ar laimime pasilikdami su pirmu sprendimu, ar pakeisdami jį?
if ($choises[$user_choise]=='car')
$staying++;
else
$switching++;
}
echo 'Staying: '.(100/$count*$staying).'%<br>
Switching: '.(100/$count*$switching).'%';
?>
Skriptas tik viską patvirtina:
Staying: 33.52%
Switching: 66.49%
Skaičiukai po kablelio varijuoja, bet rezultatas aiškus.
Na štai. Pasirodo teorija irgi gali būti įdomi :]. Jei kada šio straipsnio dėka laimėtumėte milijoną, būtų visai gražu pastatyti P4I gykams alaus :].
Daugiau informacijos: http://en.wikipedia.org/wiki/Monty_Hall_problem
Komentarų: 26
Ričardas Š.
Sausis 24, 2009, 7:25 vakare
O čia kartais ne iš vieno serialo paimta idėja? :)
Simas
Sausis 24, 2009, 7:35 vakare
Filme `21` buvo minėta berods :)
Experts
Sausis 24, 2009, 8:01 vakare
o jei jau vienos durys atidarytos tai tikimybė ne 1/2 ar kažko nesupratau? beja siūlo pakeisti dažniausiai dar neatidarius nes žadimų organizatoriai irgi moka skaičiuoti :)
NePo
Sausis 24, 2009, 8:13 vakare
Geras įrašas, klausiau kaip matematikai aiškino šitą galvosūkį :)
Experts, paimk ne 3 duris, o 10k, tu gali atidaryti tik vienas :) O žaidimo organizatorius tau atidarys 9997 už kurių yra ožkos :) dabar sėkmės skaičiuojant laimėjimo tikybes :)
Tadas
Sausis 24, 2009, 8:26 vakare
Ričardai, kokia idėja? Skriptą parašyt? :]
Experts, tame ir esmė, kad pirma mintis visiems būna “fifti-fifti” :]. Pačiam teko ilgai skaityti vikipediją ir mąstyti, kad galėčiau kuo paprasčiau tai paaiškinti lietuviškais žodžiais. Kaip matau, vistiek nelabai pavyko :]. Keliauk į vikipediją, ten net keletas pavyzdžių yra, turėtų padėti įsivaizduoti esmę.
Ernestas
Sausis 25, 2009, 12:31 ryte
Emm… O kartais neturėjo būti „uždavinys“ vietoje „problema“ ;) ? Angliškai „problem“ reiškia „uždavinys“ :) .
Ričardai, Monty Hall uždavinys – tai ne idėja kažkokio filmo ar serialo režisieriaus/scenaristo… filmų įtaka… :)
„Monty Hall visiškai pamirštama apie tai, jog kintamieji keičiasi, vadinasi, uždavinį reikia perspręsti, o ne naudoti pusę senųjų..“ Ir kažkodėl į tokį teiginį yra atsakoma lentele, kurioje pavaizduota kada tu laimi ir kada ne. Pažiūrėkim į tai iš kitos pusės – taip, matematiškai viskas teisinga, tačiau perskaičiuoti reikia, nes nesvarbu ar automobilis atsidurs už kitų durų, ar ne – tavo pasirinkimai realiai yra lygiaverčiai.
Taip, tikimybė tampa palanki keitimui, jeigu tu jos neperskaičiuosi. O perskaičiuoti reikia mat _realiam gyvenime_ reikia laikyti, jog žaidimo vedėjas nežino už kurių durų yra mašina ir nenorėdamas išsiduoti _visada_ pasiūlo pakeisti sprendimą.
Ernestas
Sausis 25, 2009, 12:34 ryte
Atsiprašau, nepabaigiau:
mano point’as yra toks: tikimybių teorijos negalima taikyti 100% gyvenime. Mat jeigu tikimybė yra, reiškia, jog toks variantas gali būti ir tai sugriauna visą pasirinkimo pagrindą. Koks tikslas rinktis pagal tikimybę, jeigu gali būti bet kas? Tikimybė tik ~33% didesnė – tai tikrai nedaug.
Tadas
Sausis 25, 2009, 11:28 ryte
“_realiam gyvenime_ reikia laikyti, jog žaidimo vedėjas nežino už kurių durų yra mašina ir nenorėdamas išsiduoti _visada_ pasiūlo pakeisti sprendimą.”
netiesa, vedėjas viską žino ir visiems tai aišku. juk jei nežinotų už kurių durų kas stovi, tai galėtų atidaryti duris, už kurių yra automobilis.
Būtent _realaus gyvenimo_ simuliacijai ir parašiau skriptą. Jis simuliuoja kiekvieną žaidimo žingsnį, o ne tiesiog atspausdina reikalingus rezultatus. Na nebent manai, kad rand() veikia geriau už žmogaus intuiciją :]
Tikimybė dvigubai didesnė. Mano gyvenime tai yra daug :]. Aišku, 2/3 negarantuoja laimėjimo, bet atsidūręs žaidime aš neabejodamas elgčiausi pagal šį principą. Tu irgi :]
Ernestas
Sausis 25, 2009, 11:49 ryte
Vedėjas visko gali ir nežinoti. Galbūt tik koks jo šefas žino viską, o vedėjui pasako tik vienerias duris, už kurių ne automobilis.
„If the host is clueless, it makes no difference whether you stay or switch. If he knows, switch“
Beje, jeigu būčiau laidos prodiuseris ar kas kitas iš vadovybės tai kaip tik pasakyčiau vedėjui tik vienas duris – nenorėčiau rizikuoti vedėjo sugebėjimais vaidinti…
Na, aš tiesiog manau, jog mašina negali dirbti kaip žmogus:
1) nemoka išsiduoti;
2) negali pasirinkti visiškai atsitiktinų durų (bet koks atsitiktinumas turi tam tikrą seką, kurią po labai didelių bandymų galima atrasti).
Todėl Mončio Hall matematinis uždavinys ir lieka matematiniu uždaviniu.
Aš abejoju ar elgčiausi – tiesiog iš principo =] . Nors tikimybė didesnė, bet ji nėra 100% ir tai reiškia, jog visko neprarandu pasilikdamas prie pirmojo sprendimo.
Tadas
Sausis 25, 2009, 2:57 vakare
Tarkim vedėjas žino tik vienerias duris, už kurių ne automobilis. Žaidėjas pasirenka būtent jas. Tai kurias duris dabar vedėjas turėtų atidaryti? Toj pačioj vikipedijoj yra aprašytas atvejis, kai vedėjas pamiršo už kurių durų yra mašina ir teko spėti.
Kas dėl rand() vs. žmogus, tai tą irgi galima būtų patikrinti :]. Gal kada nors reiks pratęsti eksperimentą.
Experts
Sausis 25, 2009, 5:16 vakare
Aš vistiek likau nieko nesuprates. Juk ir durniui aišku, kad du kart spėjant didensė tikimybė laimėti nei vieną kartą spėjant tai kur čia prikolas?
Simaas J
Sausis 27, 2009, 4:50 vakare
Šioje teorijoje yra klaida, tokia pati kaip ir skaičiuojant “metamas monetas”. jei tu meti monetą, ir iškrenta skaičius, tai daugelis galvoja, kad metant antrą kartą didesnė tikimybė iškristi herbui. Deja – ne: metant natrą kartą iškristi skaičiui tikimybė yra 50/50, nes viskas vėl skaičiuojasi nuo 0.
apie tavo skriptą: kodėl jis toks sudėtingas? iš ptadžių atmeti vieną reikšmę, o po to pasirenki vieną iš dviejų likusių? Tu paprasčiausiai skaičiuoji, kokia tikimybė yra pasirinkti “car” renkantis 1 iš 3, dėl to ir gaunasi tokios proporcijos (33 % tikimybė kad bus “car” ir 66 % tikimybė, kad bus “goat”).
Tadas
Sausis 27, 2009, 8:59 vakare
Teoriją išvedėme ne mes, o matematikai. Ginčykis su jais :]. Ir su monetos metimu lyginti čia negalima, nes tai skirtingi dalykai.
Skriptas toks todėl, kad jis turi ne skaičiuoti tikimybę, o simuliuoti kiekvieną žaidimo žingsnį. Tokia ir buvo idėja jį rašant.
KoksDarVardasBl
Kovas 12, 2009, 4:33 vakare
Ok,pagal tave: as pasirinkau duris. Vedejas atidare duris,uz kuriu buvo oska,as pakeiciau sprendima ir (pagal tave) tikimybe,kad as laimesiu tampa 2/3,kas yra 0,6666… Ok,dabar imama ir padarom taip: pakvieciam nauja zmogu (kuris apie trecias duris nera,net girdejes) ir leidziam jam spet uz kuriu duru yra masina. Tikimybe,kad jis atspes yra 1/2,kas yra 0,5,tai – 0,16 maziau,nei mano tikimybe. Tai nori pasakyti,kad vien del to,kad as maciau kazkokias trecias duris praityje mano tikimybe laimeti tampa 0,16 didesne? Ne. Vos jam atidarius duris,tavo sansas tampa 1/2,kaip ir naujai atvesto zmogaus. IMHO IMHO IMHO
SS
Kovas 24, 2009, 1:28 ryte
# //ar laimime pasilikdami su pirmu sprendimu, ar pakeisdami jį?
# if ($choises[$user_choise]==’car’)
# $staying++;
# else
# $switching++;
Sitai skaiciuoja tikimybe, jog atspejai ir tikimybe jog neatspejai.
Reiketu kazka tokio darasyti:
$skaicius = 0;
$user_random_choise = rand(0, 1);
foreach($choises as $key => $choise)
{
if($skaicius == $user_random_choise)
{
$user_changed_choise = $key;
}
$skaicius++;
}
//ar laimime pasilikdami su pirmu sprendimu, ar pakeisdami jį?
if ($choises[$user_choise]==’car’)
$staying++;
if($choises[$user_changed_choise]==’car’)
$switching++;
echo ‘Staying: ‘.(100/$count*$staying).’%
Switching: ‘.(100/$count*$switching).’%';
neworld
Kovas 31, 2009, 2:07 vakare
Tamsta autoriau matau palikote klaidą.
skripto esmė tokia, jog $choises masyvas turi tris reikšmes, ir tu vėliau viena reiškmę su ožka išmeti. Taigi lieka vienas variantas su mašina, vienas variatas su mašina ir vienas tusčias variantas. Kadangi sekančiame cikle tu tos reikšmės nesugražini, o tik sukeiti vietomis (arba ne) užką su mašina, ir vėl renkiesi iš trijų variantų. Taigi lieka 1/3 jog pasirinksi ožką, 1/3 pasirinksi mašina, ir 1/3 jog pasirinksi null
Netiki? Tada pabandytk ieškoti kokia itkimybė pasirinkti ožką:
if ($choises[$user_choise]==’goat’)
pamatysi, gausi tuos pačius rezultatus.
O jeigu ir dar netiki, įsijunk, jog rodytų notices.
Va jums ir teorija
neworld
Kovas 31, 2009, 2:13 vakare
Dar pamiršau paminėti. Jeigu tu vis regeneruosi $choises, vistiek rezultatas bus toks pat. Kadangi tu vis išmesi vieną reikšmę, bet kam to reikia, jug galutiniame tikrinime tai visiškai neaktualu. Jeigu nori, tu gali durų pridėti, už išmestų durų įdėti mašiną, ar ką tik nori, rezultatas bus visada toks pats.
Tadas
Balandis 5, 2009, 6:28 vakare
my bad, pataisiau :]. taip, pašalinus vieną masyvo elementą kitame cikle jis neatsinaujindavo, ir būdavo sudarytas tik iš 2 likusių elementų. dabar skriptas veikia korektiškai, nors išvadų tai nekeičia :]
neworld
Balandis 5, 2009, 6:39 vakare
Aišku nekeičia, ir neturi keisti. Tu pats pagalvok, išmetimą gali pašalinti, gali vietoj išmetimo pridėti dar 1000 car elementų, vistiek atsakymas bus tas pats. Čia tas pats kas iš tos serijos:
$a=1;
$b=2;
$c=3;
if ($a==1) {
$good++;
} else {
$bad–;
}
Aišku, čia atsakymas būtų 100%, o pas tave 33%, nes viena mašina gali būti bet kuriame slote (pas mane bus tik viename), t.y. 1/3 tikimybė jog mašina bus pirmame slote.
Gal ši teorija tai ir aiškina, bet tada, tai jug elementaru. Situacija nesikeistų, jeigu vedėjas ir neatidarytu durų.
Tadas
Balandis 5, 2009, 8:40 vakare
daug daug kartų skaičiau, ką parašei, po to ilgai žiūrėjau į kodą, bet taip ir nesupratau, kas, tavo nuomone, šiame kode neveikia.
kodas renkasi TIK iš 2 elementų.
if ($choises[$user_choise]==’car’)
$staying++;
else
$switching++;
ši sąlyga patikrina, ar pirmosios žaidėjo pasirinktos durys neslepia mašinos. jei taip – puiku, skaitome, kad apsimoka laikytis savo pirmojo spėjimo.
jei už pirmai pasirinktų durų mašinos nėra, laikome, kad už jų ožka (tik 2 elementai, taigi tik 2 variantai). jeigu už jų ožka, laikome, kad žaidėjui apsimoka pakeisti savo pirminį pasirinkimą.
pakartojame žaidimą daugybę kartų ir matome rezultatus. tiek to kodo.
neworld
Balandis 5, 2009, 10:55 vakare
Ne, ši sąlyga patikrina kokia tikimybė jog už šitų duru bus mašina, jeigu nepakeitei sprendimo. Bent pagal kodą taip supratau.
Manau, gal visai nieko būtų, jeigu tu išmetęs nereikalingą variantą dar kart apaleistum shufle, primeskim jog ir vedėjas nežino už kurių konkrečiai yra mašina :)
Tadas
Balandis 6, 2009, 10:47 ryte
tą ir sakiau :]
dar kartą paskaityk, kaip vyksta žaidimas. kodas tiksliai atkuria jo eigą, todėl negaliu vėl sumaišyti elementų – taisyklės ne tokios :]
smagu, kad kažkas dar netingi gilintis :]. keista, kad iki tol niekas nepastebėjo tos kvailos klaidos.
neworld
Balandis 6, 2009, 5:50 vakare
Na bet vistiek, kvaila teorija. Nes kad išloši mašiną yra lygiai 50%. tie 67% po durų pakeitimo gauans tik tada, kai lygini su busena, kai visos durys uždarytos, ir tai tiksliai atkartoja tavo kodas.
Edvinas
Liepa 12, 2009, 9:59 ryte
O jei išsirenki automobilį? :) tada jei pasirenki antras duris automobilį laimėt galimybės lygios nuliui.
neworld
Liepa 12, 2009, 6:56 vakare
Tačiau matematiškai paskaičiavus gauname 2/3 tikimybę, nes vedėjas visada atidaro dusi kuriose yra ožką, vadinasi iš pradžių turi tik 1/3 pataikyti, o 2/3 nepataikyti, tačia po persigalvojimo, jeigu tu nepataikei iš pirmo sykio, garantuotai pataikysi iš antro sykio. Jeigu tu pataikei pirmame raunde, tai antrame garantuotai nepataikysi
E. M.
Spalis 15, 2009, 7:34 vakare
Nesvarbu ar pakeisi sprendima ar ne, sansai laimeti vistiek bus 1/3. Jei pasirenki vienas duris ir nezinodamas kas uz ju, pakeiti sprendima, tavo sansai laimeti padides 0%.