vendredi 22 août 2014

Les trois portes

Un problème classique de probabilité modélisé avec une figure Pharo.
« Un vizir montre trois portes, A, B et C à Sinbad, son mathématicien. Il lui explique que derrière l’une d’elles se trouve une pièce d’or et que rien ne se trouve derrière les deux autres. Si Sinbad choisit la bonne porte, il gagne la pièce d’or.
Sinbad choisit une porte sans l’ouvrir.
A ce moment-là, le vizir lui explique : « Je vais maintenant ouvrir une des deux portes que vous n’avez pas choisie et derrière laquelle il n’y a rien. »
Le vizir, comme promis, ouvre une porte et dévoile un espace vide. Il ajoute : « Je vous offre donc la possibilité de changer votre choix ou pas. Que faites-vous ? »
Sinbad sourit, car il connaît « LA » stratégie pour gagner le plus souvent possible.
Détermine cette stratégie.
Notons bien qu’à chaque partie les choses se déroulent de la même façon : Sinbad a la possibilité de changer son premier choix après avoir vu la porte ne donnant rien. Le vizir sait où se trouve la pièce d’or. »
La figure Pharo, dont le script est donné ci-dessous, simule 10'000 essais dans lesquels Sinbad change systématiquement de choix de porte. La figure se construit devant l'utilisateur au fur et à mesure du déroulement des 10'000 essais.
La simulation révèle enfin que dans ce cas le pourcentage de victoire est approximativement 67%.
|piece portes choixSinbad vizirPossible choixVizir portesVizir n successes  canvas pointG pointP segment|
canvas := DrGeoCanvas new.
canvas centerTo: 0@3; scale: 20.
pointG := canvas point: -1@0.1.
segment := canvas segment: ((canvas point: -1@0) name: 'GAGNÉ') to: pointG.
segment large; color: Color green.
pointP := canvas point: 1@0.1.
segment := canvas segment: ((canvas point: 1@0) name: 'PERDU') to: pointP.
segment large; color: Color red.
successes := 0.
n := 10000.
canvas do: [
1 to: n do: [ :compte |
    portes := { 0. 0. 0.}.
    piece := 3 atRandom.
    portes at: piece put: 1.
    choixSinbad := 3 atRandom.
    "Quel choix de portes pour le vizir ?"
    vizirPossible := #(1 1 1) - portes. "pas la porte avec le pièce"
    vizirPossible at: choixSinbad put: 0.  "pas la porte choisie par Sinbad"
    "On collecte les choix possibles pour le vizir, 1 ou 2 selon"
    portesVizir := OrderedCollection new.
    vizirPossible withIndexDo: [:choix :i| choix = 1 ifTrue: [portesVizir add: i]].
    "Le Vizir choisit une porte"
    choixVizir := portesVizir atRandom.
    "Sinbad choisit l'autre porte"
    portes := {1. 1. 1}.
    portes  at: choixVizir put: 0; at: choixSinbad put: 0.
    portes withIndexDo: [:choix :i| choix = 1 ifTrue: [choixSinbad := i]].
    "Si c'est la porte avec la pièce alors succès"
    piece = choixSinbad ifTrue: [ successes := successes + 1].
    "On actualise les barres horizontales des succès et echec"
    pointG rename: successes asString;
        moveTo: -1@(10 * successes / n).
    pointP rename: (compte - successes) asString;
        moveTo: 1@(10 * (compte - successes) / n).
    canvas update].
pointG
    rename: ((100 * successes / n) round: 2) asString, ' %';
    moveTo: -1@(10 * successes / n).
pointP
    rename: ((100 * (n - successes) / n) round: 2) asString, ' %';
    moveTo: 1@(10 * (n - successes) / n)].