La figure Smalltalk, 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%.

Les trois portes

|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)].