Script bash: il problema di Monty Hall

Qualche tempo fa il buon Randall Munroe, l’autore di XKCD, ha pubblicato la vignetta riportata qui sotto, il cui significato mi era inizialmente sfuggito:

Si intuisce che l’omino sia ben contento di aver vinto una capra in quello che sembrerebbe uno show televisivo, l’alt text dell’immagine (quello che viene fuori tenendoci su il cursore) parla di un’altra capra che va via in macchina (“A few minutes later, the goat from behind door C drives away in the car“).

Ok, due capre ed una macchina in palio, e l’omino preferisce la capra… Strano…

Prima che veleggiassi alla volta di Wikipedia per saperne di più, è arrivato il tempestivo post esplicativo di Barney, fan accanito di XKCD, che vi consiglio di leggere. Anzi, già che ci siete, leggete anche il resto del blog!

Ma la gita sulla Wiki era solo rimandata, per andare a scovare qualche altro dettaglio in merito. Il succo della pagina (qui) è questo:

Il problema di Monty Hall è un famoso problema di teoria della probabilità, legato al gioco a premi americano Let’s Make a Deal. Prende il nome da quello del conduttore dello show, Maurice Halprin, noto con lo pseudonimo di Monty Hall.

Nel gioco vengono mostrate al concorrente tre porte chiuse; dietro ad una si trova un’automobile, mentre ciascuna delle altre due nasconde una capra. Il giocatore può scegliere una delle tre porte, vincendo il premio corrispondente. Dopo che il giocatore ha selezionato una porta, ma non l’ha ancora aperta, il conduttore dello show – che conosce ciò che si trova dietro ogni porta – apre una delle altre due, rivelando una delle due capre, e offre al giocatore la possibilità di cambiare la propria scelta iniziale, passando all’unica porta restante.

Cambiare porta migliora le chance del giocatore di vincere l’automobile? La risposta è sì: cambiando le probabilità di successo passano da 1/3 a 2/3.

Il problema è anche noto come paradosso di Monty Hall, poiché la soluzione può apparire controintuitiva, ma non si tratta di una vera antinomia, in quanto non genera contraddizioni logiche.

Cosa mancava al quadro? Ma ovviamente giocare con Monty Hall! E potevo mai perdere tempo a cercare un giochino già pronto? Certo che no. Piuttosto, mi sono sgranchito le dita e mi sono messo a scrivere un rozzissimo scriptino bash che facesse, è il caso di dirlo, il mio gioco. Dopotutto l’esperimento dei giochini in bash era già andato bene con “Rock, Paper, Scissors, Lizard, Spock” quindi perché non ripeterlo (con meno pretese)?

Ed eccolo qui il giochino di Mr. Monty Hall, in tutto il suo splendore (?):

#!/bin/bash
# Monty Hall game
stat_win=0
stat_lose=0
stat_change=0
onemore=Y
echo "Welcome to the Monty Hall game,
you can win a car or a goat."
while [[ ${onemore^} = "Y" ]]
do
declare -a doors
win_door=$(($RANDOM%3+1))
doors[$win_door]="car"
for i in {1..3}
do
if [[ $i -ne $win_door ]]
then
doors[$i]="goat"
fi
done
echo '.---..---..---.
| 1 || 2 || 3 |
°---°°---°°---°'
guess=0
until [[ $guess =~ [1|2|3] ]]
do
echo -n "Please choose one of the doors: (1, 2, 3)> "
read -n 1 guess
echo
done
declare -a rem_doors
#assegna all'array gli elementi diversi da guess
j=1
for i in {1..3}
do
if [[ $i -ne $guess ]]
then
rem_doors[$j]=$i
let j+=1
fi
done
if [[ ${doors[${rem_doors[1]}]} = ${doors[${rem_doors[2]}]} ]] #two goats
then
other_goat=${rem_doors[$((RANDOM%2+1))]}
else
j=1
until [[ ${doors[${rem_doors[$j]}]} = "goat" ]] #find the goat!
do
let j+=1
done
other_goat=${rem_doors[$j]}
fi
last_door=${rem_doors[$((j%2+1))]} # switch btw 1 and 2 maths hack!
echo -n "Behind door $other_goat there's a goat.
Do you want to change your choice to door $last_door? (y/n)> "
read -n 1 switch
if [[ ${switch^} = "Y" ]]
then
let stat_change+=1
echo -e "\\nNice! Now your choice is door number $last_door."
guess=$last_door
fi
if [[ $guess -eq $win_door ]]
then
echo -e "\\nCongratulations! You won the car!"
let stat_win+=1
else
echo -e "\\nHere's your brand new... goat! Take care of it!"
let stat_lose+=1
fi
echo "So far you played $((stat_lose+stat_win)) turn(s) [Win $stat_win / Lose $stat_lose] and changed door $stat_change time(s)"
echo -n "One more turn (y/n)?> "
read -n 1 onemore && echo
if [[ ${onemore^} != "Y" ]]
then
echo "Well, I see, you goat-ta go... Bye!"
fi
done
exit

Un po’ spartano magari, mancherebbe forse una capretta in HD o la macchina in 3D, ma funzionante. Lo script è in inglese perché a) il gioco originale è inglese/americano/awanagana, b) perché questo post è destinato alla traduzione, c) perché mi fido della Qultura linguistica dei miei lettori e d) perché ho cominciato a scrivere il testo in inglese e non mi andava di modificare tutto, soprattutto in previsione di b).

E poiché si tratta di matematica, l’antinomia controintuitiva (come se fosse antani) andava verificata. In effetti il “nocciolo” dello script nella sua primissima stesura non faceva nient’altro che questo: giocare automaticamente un gran numero di “partite”(con o senza cambio di porta) e raccogliere i dati (capre vs. macchine): uno di quei compiti stupidi e noiosi per i quali i computer sono perfetti.

Sapete una cosa? Ha funzionato: per vincere una capra dovete conviene davvero tenere la scelta iniziale! Questo sì che è un BEEEEl risultato!

Informazioni su Man from Mars

https://extendedreality.wordpress.com/

  1. Ciao !
    ma sai su cosa stavo scrivendo ( o meglio stavo tentando di scrivere ) il prossimo post ?
    ( aiutino: ” teoria dei giochi” … )
    Se indovini non vinci nulla, tranne la nomea di “sensistivo” o “veggente” 😀

    PS: bellissimo script!!!

    Mi piace

    • Pensa che avevo questo post nel cassetto da un bel pezzo. Si vede che l’entanglement funziona anche tra blog… 🙂
      Grazie per i complimenti, le mie doti di scripting non sono eccelse e, come ho scritto, lo script mi sembra forse un tantino più complicato di quanto potrebbe, però meglio di così non sono riuscito a fare per il momento.
      Il problema è stato gestire l’eventuale “cambio” di porta rispetto all’effettiva porta vincente.
      A quante capre sei?

      Mi piace

      • non sto “capreggiando” in questo momento…
        Sto cercando di capire come fare un altro script su un problema diverso
        E sto cercando di capire come riscrivere il mio post, che a questo punto e’ mezzo da buttare.
        Sai se si possono ribloggare 2 post diversi allo stesso tempo ?
        Vorrei ribloggare il tuo post e quello che ho trovato su un altro blog, in quanto parlano entrambi della teoria dei giochi applicata a diversi campi dello scibile 🙂

        Mi piace

        • Se intendi usare il tasto “Reblog” o “Pubblicalo” allora no, puoi ribloggare un post alla volta. Piuttosto fai un piccolo post con i link tipo:
          “Ho trovato questo (link1) e questo (link2) attinenti al mio prossimo post, etc. etc..” che faccia da “apripista” al prossimo.
          Mi dispiace averti scombinato i piani, a saperlo prima ci si organizzava… Maledetto entanglement blogghistico!

          Mi piace

  2. Grazie per la citazione, e buona capra a tutti 😛

    Mi piace

  3. Bellissimo post!

    Mi piace

  4. Pingback: La Teoria dei Giochi | Num3ri v 2.0

  5. Pingback: Bash game: the Monty Hall problem | Extended Reality

  6. Pingback: A che gioco giochiamo ? | Num3ri v 2.0

Dimmi che ne pensi o fai "Ciao ciao!" con la manina // Share your thoughts or just say "Hello!"

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: