Monty Hall Pythonilla

Luin Dimensiosta Hannu Korhosen kirja-arvion Tapio Lindin Vesimelonin kuivatus ja muita matemaattisia pähkinöitä -kirjasta. En ole vielä ehtinyt lukemaan kirjaa, mutta se pitänee lukea lähiaikoina. Kirjassa yhtenä ongelmana on kuuluisa Monty Hall-probleema. Aihe on kuikertanut mielessäni jo jonkin aikaa. Niinpä päätin tehdä siitä pienen Python ohjelman. Lähinnä itselleni ja samalla myös oppilaitani varten esimerkkinä siitä, miten sanallinen ongelma käännetään tietokoneohjelmaksi.

Ongelma sanallisesti

Wikipediassa Monty Hall -ongelma esitetään seuraavasti: ” Monty Hallin ongelmassa kilpailijalla on edessään kolme ovea. Yhden oven takana on palkintona auto, kahden muun takana vuohi. Kilpailija, joka ei tiedä minkä oven takana mikin palkinto on, saa valita ovista yhden. Valittuaan oven hän ei vielä avaa sitä. Jäljelle jääneistä kahdesta ovesta avataan toinen, ja sen takana on aina vuohi. Tämän jälkeen kilpailija saa valita, vaihtaako ensin valitsemansa oven toiseen jäljellä olevaan suljettuun oveen, vai pitääkö ensin valitsemansa oven.”

Varmaankin kaikki matikan opet tietävät (viimeistään lukemalla ratkaisun Wikipediasta), että kilpailijan kannattaa vaihtaa, sillä pitämällä ensimmäisen valinnan, niin todennäköisyys voittoon on 1/3 ja vaihtamalla 2/3.

Python koodi

Tehdään Pythonilla ohjelma, joka noudattaa edellä esitettyä tilannetta siten, että kilpailija vaihtaa aina valintansa. Koodia kirjoittaessa en käytä järkeä siinä mielessä, että oikaisisin suoraan ratkaisuun. Toteutan tilanteen ikään kuin ohjeen mukaan. Laitan koodiin rivinumerot ja kommentit, joiden avulla yritän kertoa lukijalle mitä koodissa tapahtuu.

Muutama kommentti koodista

Lukijan on hyvä muistaa, että Pythonissa listan ensimmäisen jäsenen järjestysluku on nolla, toisen järjestysluku on 1 jne. Siksi ovien numerot ovat 0, 1, ja 2.

Rivillä 9: shuffle(lista) funktio sekoittaa syötelistansa jäsenet satunnaisesti.

Rivillä 13: randint(a, b) tuottaa satunnaisen kokonaisluvun väliltä [a, b].

Rivillä 17: pop-metodi poistaa olion listasta ja antaa sen tulosteena.  Jos lista  = [13, 42, 666, 42], niin lista.pop(1) antaa tulokseksi luvun 42 ja samalla listasta katoaa jäsen 42, eli nyt lista on [13, 666, 42].

Rivillä 20: remove-metodi poistaa ensimmäisen esiintymän syötteestään. Jos lista  = [13, 42, 666, 42], niin lista.remove(42) muutaa listan listaksi [13, 666, 42].

Rivillä 23: Leikkauksien avulla saadaan valittua listasta jäseniä. Jos lista on lista  = [13, 42, 666, 42], niin lista[1] tulostaa luvun 42.

Alla ohjelman tuottama tulos muutamalla suorituskerralla.

Kun tuota ohjelmaa ja tulosteita katsoo, niin pikku hiljaa (ainakin minulle) selkenee, että tässä pelissä pelaaja voittaa, jos hän on alun perin valinnut vuohen. Vuohi valitaan todennäköisyydellä 2/3.

Tehdään vielä ohjelmaan sellainen muutos, että suoritetaan se vaikkapa 1000 kertaa ja lasketaan voittojen lukumäärä.

Alla ohjelman tulos:

Seuraavassa tarinassani muokkaan ongelmaa/ohjelmaa sellaiseksi, että vuohia onkin vaikkapa 5 ja voittoautoja 2. Ja samalla tietysti pohdin, mikä siinä tilanteessa on voiton todennäköisyys.

Lähteet

https://dimensiolehti.fi/kirjallisuutta-vesimelonin-kuivatus/

https://fi.wikipedia.org/wiki/Monty_Hallin_ongelma

 

Layers in GeoGebra

When you create objects that overlap in Graphics window, then the newest will be on top. In this article I will show how to change the order of the objects. Revathy, my Fulbright sister asked me to translate this article from Finnish. So I had to do it.  

Create two triangles and change the colors by selecting them and using the Style bar at the top of the Graphics window. The red triangle t1 is created first and the green t2 triangle second.

Here we see that the sides of the red triangle are on top of the green triangle, so there is something wrong in the logic. Is it a bug or feature, I don’t know?

I will use the Layers setting to change the order. Click the red triangle with the right button of the mouse and select Object properties…. In Object properties window click the right arrow to the right and select Advanced. All objects are on layer 0 by default. There are 10 possible layers numbered 0, 1, …, 9.

Change the Layer setting to 1 for the triangle t1. Now the red triangle is on top of the green triangle. Actually the sides are still in 0 Layer, so change the layer value for the red sides also.

When working with layers there is a handy shortcut to select all the objects on a layer Ctrl-L. Create a pentagon and set it to layer 1. 

Select the pentagram by clicking it and then use shortcut Ctrl – L (Cmd – L on a Mac). Now the triangle and the pentagram are selected, so you can move and change the colors if you like.

The Layer help page on GeoGebra wiki is at. https://wiki.geogebra.org/en/Layers

Tasot GeoGebrassa

Kun GeoGegrassa luo objekteja piirtoalueelle, niin ne asettuvat päällekäin siinä järjestyksessä kuin ne on luotu. Näytän miten niiden järjestystä voi muuttaa.

Loin Piirtoalueelle kaksi kolmiota ja vaihdoin niiden värit käyttämällä työkalua Piirtoaluuen yläreunassa. Punainen kolmio k1 on luotu ensin ja vihreä k2 sen jälkeen.

Tässä huomataan, että punaisen kolmion kyljet näkyvätkin vihreän kolmion päällä. Tämä taitaa olla bugi.

Objektion järjestystä voi muuttaa Tasot asetuksella. Sen löytää vaikkapa klikkaamalla objektia hiiren oikealla painikkeella ja valitsemalla Ominaisuudet ja sieltä Lisäasetukset.

Oletuksena kaikkien objektien Taso on 0. Valittavana on 10 eri tasoa. Näiden avulla objektien järjestystä voi muuttaa.

Loin viisikulmion ja valitsin kaikki sen osat. Asetin ne tasolle 1. Kun valisin punaisen kolmion, joka on tasolla 1ja klikkasin Ctrl-L, niin kaikki tason 1 objektit tulivat valituiksi.

Näin pystyin helposti vaihtamaan kaikkien tason 1 objektien värin.

Tasojen ohje GeoGebra wikisivulla:  https://wiki.geogebra.org/en/Layers