Le Monopoly pour les nuls

Philippe Gaucher

8 septembre 1996

Recompilé le 12 mars 2014 avec tth et réarrangé pour MathJax pour avoir un code HTML 5.0 standard et moins lourd. Si vous apercevez un problème, n'hésitez pas à m'envoyer un email merci.Powered by MathJax


Sur le Monopoly américain : Probabilities in the Game of Monopoly
Egalement en PDF.

1  Introduction

Le but de cet exposé est de prouver que, contrairement à une idée reçue (cf par exemple l'article de Ian Stewart dans le "Pour La Science" de Juin 1996), les différentes cases du Monopoly ne sont pas équiprobables. Nous avons fait des tests sur le Monopoly français. Nous verrons même qu'il y a des disparités entre les cases, entre les lotissements, et à l'intérieur des lotissements.
Pour prouver cela, nous avons choisi la simulation. Nous avons fait un programme en PERL, a priori exécutable sur n'importe quelle machine UNIX afin de simuler des suites de tours. Soyons clair, l'aspect financier n'est absolument pas pris en compte. Il n'intervient pas d'ailleurs sur la suite de déplacements que peut faire un joueur au cours d'une partie.
Nous avons par contre pris en compte tout ce qui intervenait pour les déplacements : le tirage des cartes "Chance" et "Caisse de Communauté", avec les effets sur la position, la prison au bout de trois doubles et la case "Allez en prison".
Un rappel succinct des règles est fait dans la section . La section expose les résultats pour chaque case, et la section pour chaque groupe. On conclut ensuite en section . Le programme proprement dit est rejeté en annexe (section ) pour ne pas alourdir l' exposé.

2  Rappel des règles du jeu du Monopoly

Nous allons seulement rappeler les règles qui comptent pour les déplacements.
Par convention, on considèrera qu'il y a 41 cases : cela va de la case "Départ" (numéro 0) à la case "Rue de la Paix" (numéro 39), la case "Prison" ayant le numéro 40, la case "Simple Visite" ayant le numéro 10. Voici la liste détaillée des cases : Case Départ, Belleville, Caisse de Communauté, Lecourbe, Impôts, Gare Montparnasse, Vaugirard, Carte Chance, Courcelles, Républiques, Simple Visite, La Villette, Cie Électricité, Neuilly, Paradis, Gare de Lyon, Mozart, Caisse de Communauté, Saint-Michel, Pigalle, Parc Gratuit, Matignon, Carte Chance, Malesherbes, Henri-Martin, Gare du Nord, Saint-Honoré, La Bourse, Cie des Eaux, La Fayette, Allez en Prison, Breteuil, Foch, Caisse de Communauté, Capucines, Gare Saint-Lazare, Carte Chance, Champs-Élysées, Taxe de Luxe, La Paix, Prison.
Comme il peut y avoir des éditions différentes du Monopoly, nous allons préciser aussi les couleurs des lotissements : les bruns (Belleville, Lecourbe), les bleus clairs (Vaugirard, Courcelles, Républiques), les violets (La Villette, Neuilly, Paradis), les oranges (Mozart, Saint-Michel, Pigalle), les rouges (Matignon, Malesherbes, Henri-Martin), les jaunes (Saint-Honoré, La Bourse, La Fayette), les verts (Breteuil, Foch, Capucines), les bleus foncés (Champs-Élysées, La Paix).
Une partie commence sur la case "Départ". A chaque tour, le joueur lance deux dés. Au bout de trois doubles consécutifs, le joueur va en prison. S'il tombe sur une case "Chance" ou bien "Caisse de Communauté", il tire une carte dans la pile correspondante, et ce tirage est éventuellement suivi d'un effet immédiat au niveau de la position. Quand on est en prison, on peut en sortir gratuitement en faisant un double dans les trois tours qui suivent celui de l'emprisonnement, sinon on doit payer pour sortir. On peut sortir avant la fin des trois tours en payant.
Voici la liste détaillée des cartes "Chance" : 1 envoie en prison, 1 envoie vers l'avenue Henri-Martin, 1 envoie vers boulevard de la Villette, 1 envoie vers la Rue de la Paix, 1 envoie vers la gare de Lyon, 1 envoie sur la case Départ, 1 "Reculez de trois cases". Il y a 9 autres cartes "Chance" qui n'ont aucune influence sur la position
Voici maintenant la liste détaillée des cartes "Caisse de Communauté" : 1 "Retournez à Belleville", 1 envoie en prison, 1 envoie sur la case Départ, 1 possibilité de tirer une carte "Chance" (alternative avec une amende). Il y a 12 autres cartes "Caisse de Communauté" qui n'ont aucune influence sur la position.
Nous allons considérer 4 types de stratégie pour la simulation en combinant les deux options suivantes : 1) quand on tire la carte "Caisse de Communauté" qui nous propose le choix entre le tirage d'une carte "Chance" et le paiement d'une amende, on peut choisir de tirer toujours une carte "Chance" (option C), ou bien on peut choisir de toujours payer une amende (option $\urcorner$C) ; 2) quand on est en prison, on peut choisir de rester en prison et d'attendre de faire un double, pendant au maximom trois tours évidemment (option P), ou bien on peut choisir de sortir tout de suite (option $\urcorner$P). Ces options combinées font bien quatre stratégies.
Quand une simulation commence, l'ordinateur ne change pas de stratégie. Et on peut objecter que tout ceci est artificiel : par exemple, en fin de partie, quand beaucoup de lotissements sont construits, on préfère rester en prison, alors qu'en début de partie, on se dépèche d'acheter, mais tout ceci n'est pas grave car nous allons voir que le choix de telle ou telle stratégie n'influe pas sur le "poids statistique" qu'a telle ou telle case.
Passons maintenant aux résultats obtenus.

3  Les résultats case par case

Il y a quatre simulations correspondant aux quatre combinaisons possibles de stratégies. Les résultats concernant la simulation $N$ ($N$ variant de 1 à 4) sont dans les colonnes $2N$ et $2N+1$. Par convention, on a supposé qu'une partie durait 100 tours.
Fixons $N$. La simulation $N$ consiste à effectuer 50 fois 1000 parties. Pour chaque case, on obtient $50$ nombres entiers $c^1$, $c^2$, ... $c^{50}$ qui signifient que pendant les 1000 premières parties, on est passé $c^1$ fois par cette case, dans les 1000 parties suivantes, on est passé $c^2$ fois par cette case, etc... (les exposants ne sont pas des puissances ici mais des indices) Soit $C$ le nombre de tours effectivement joués dans la simulation $N$. Le nombre tout en bas de la colonne $2N$ est égal à $\left(\frac{C}{41*50}\right)$ : c'est la valeur théorique dans le cas équiprobable des nombres $c^1$, $c^2$, etc...
Ces nombres ne figurent pas dans le tableau ci-dessus car ils auraient été trop peu parlants.
Pour chaque case, on calcule alors la moyenne arithmétique et l'écart-type de ces $50$ nombres. Rappelons que la moyenne arithmétique $m$ est donnée par la formule : $$ m=\frac{c^1+c^2+\ldots+c^{50}}{50} $$ et que l'écart-type $\sigma$ est donné par la formule : $$ \sigma^2=\frac{(c^1-m)^2+(c^2-m)^2+\ldots+(c^{50}-m)^2}{50}. $$ Pour que la formule soit plus parlante, on n'a pas inscrit directement ces deux nombres (mais on peut les retrouver avec le tableau ci-après) mais plutôt les deux nombres suivants (multipliés par $100$ dans le tableau) : $$ \widetilde{m}=\frac{m-\left(\frac{C}{41*50}\right)}{\left(\frac{C}{41*50}\right)}\hbox{, }\widetilde{\sigma}=\frac{\sigma}{\left(\frac{C}{41*50}\right)}. $$ Dans la suite de l'exposé, le couple $(\widetilde{m},\widetilde{\sigma})$ s'appellera le poids statistique de la case.
Ainsi, les tableaux ci-après permettent de savoir si, par rapport au cas équiprobable, une case est plutôt plus, plutôt moins ou plutôt pareillement fréquentée. Par exemple, dans la simulation 1, on lit pour Vaugirard que son poids statistique est (−10.6 %, 1.6 %). Cela signifie que pour la stratégie CP, la case Vaugirard est 10.6% moins fréquentée que dans le cas (imaginaire) équiprobable avec un écart-type de 1.6%. Le poids statistique ne mesure donc pas la fréquentation statistique, mais "l'écart" par rapport à un hypothétique cas équiprobable.
Pour ce qui est du choix des valeurs 50 et 1000 (50 fois 1000 parties pour chaque simulation), disons que d'autres choix de valeurs ne changent pas fondamentalement les résultats des simulations sur ordinateur : la convergence est très rapide.
Voici maintenant les tableaux de résultat. Pour des questions de commodité et de clarté, on a fait un tableau par côté.
$$\begin{array}{|l|l|l|l|l|l|l|l|l|} \hline & \hbox{CP} && \hbox{${\urcorner}$CP} && \hbox{C${\urcorner}$P} && \hbox{${\urcorner}$C${\urcorner}$P}&\\ \hline \hbox{Case Départ} & 17.3 & 1.7 & 16 & 1.5 & 17.4 & 1.4 & 17 & 1.7 \\ \hline \hbox{Belleville} & -1.4 & 1.3 & -1.2 & 1.4 & -.9 & 1.3 & -.3 & 1.9 \\ \hline \hbox{Caisse de Communauté} & -17.3 & 1.7 & -17.1 & 1.7 & -17.2 & 1.5 & -16.7 & 1.5 \\ \hline \hbox{Lecourbe} & -15.9 & 1.9 & -15.6 & 1.8 & -16.2 & 1.4 & -15.4 & 2 \\ \hline \hbox{Impôts} & -9.1 & 1.9 & -9.2 & 1.7 & -9 & 2.2 & -9 & 1.8 \\ \hline \hbox{Gare Montparnasse} & -13.2 & 1.7 & -13.4 & 1.5 & -13.1 & 1.5 & -13.5 & 1.7 \\ \hline \hbox{Vaugirard} & -10.6 & 1.6 & -10.4 & 1.9 & -11.2 & 1.5 & -10.8 & 1.6 \\ \hline \hbox{Carte Chance} & -8.8 & 1.8 & -9.1 & 1.8 & -9.6 & 1.7 & -9.5 & 1.9 \\ \hline \hbox{Courcelles} & -10.1 & 1.4 & -9 & 1.8 & -10.4 & 1.6 & -10 & 1.8 \\ \hline \hbox{Républiques} & -11.6 & 1.8 & -11 & 1.5 & -11.5 & 1.9 & -10.9 & 1.7 \\ \hline \hbox{Simple Visite} & -13.5 & 1.3 & -12.6 & 1.8 & -14.2 & 1.4 & -13.5 & 1.7 \\ \hline \hbox{Prison} & 61.4 & 2.2 & 59.4 & 2.1 & 60.5 & 2 & 58.7 & 2.3 \\ \hline \hbox{Nombre moyen par case}& 2467.1 & & 2465.5 & & 2624.3 & & 2618.9 & \\ \hline \end{array}$$ $$\begin{array}{|l|l|l|l|l|l|l|l|l|}\hline & \hbox{CP} && \hbox{${\urcorner}$CP} && \hbox{C${\urcorner}$P} && \hbox{${\urcorner}$C${\urcorner}$P}&\\ \hline \hbox{La Villette} & 3.2 & 1.6 & 2.6 & 1.6 & 2.9 & 1.6 & 2.5 & 1.8 \\ \hline \hbox{Cie électricité} & -6.7 & 1.8 & -6 & 2 & -13.1 & 1.4 & -12.8 & 1.7 \\ \hline \hbox{Neuilly} & -12.8 & 1.9 & -12.9 & 1.9 & -10.4 & 1.6 & -9.8 & 1.8 \\ \hline \hbox{Paradis} & -.9 & 2.1 & -1.1 & 1.5 & -5.1 & 1.6 & -5.5 & 1.5 \\ \hline \hbox{Gare de Lyon} & 14 & 2.1 & 13.3 & 1.9 & 18.9 & 1.9 & 17.5 & 1.4 \\ \hline \hbox{Mozart} & 8.2 & 2.1 & 8.1 & 1.6 & 6.4 & 1.9 & 6.5 & 1.8 \\ \hline \hbox{Caisse de Communauté} & 5.6 & 2 & 5.4 & 2.2 & 13.2 & 1.9 & 13.3 & 1.9 \\ \hline \hbox{Saint-Michel} & 13.9 & 1.7 & 14 & 2.1 & 11.7 & 1.9 & 11.2 & 2 \\ \hline \hbox{Pigalle} & 12.5 & 1.8 & 12.1 & 1.9 & 16.3 & 1.8 & 16.1 & 1.9 \\ \hline \hbox{Parc Gratuit} & 12.7 & 2.2 & 12.4 & 2.1 & 8.5 & 1.8 & 8.8 & 1.7 \\ \hline \hbox{Nombre moyen par case}& 2467.1 & & 2465.5 & & 2624.3 & & 2618.9 & \\ \hline \end{array}$$ $$\begin{array}{|l|l|l|l|l|l|l|l|l|}\hline & \hbox{CP} && \hbox{${\urcorner}$CP} && \hbox{C${\urcorner}$P} && \hbox{${\urcorner}$C${\urcorner}$P}&\\ \hline \hbox{Matignon} & 4.3 & 2.1 & 4.8 & 1.9 & 7.4 & 1.9 & 7.1 & 1.7 \\ \hline \hbox{Carte Chance} & 12.4 & 2.2 & 12.6 & 2.1 & 5.7 & 1.7 & 6.1 & 1.8 \\ \hline \hbox{Malesherbes} & 3.5 & 1.8 & 3.3 & 1.6 & 3.7 & 1.8 & 4.2 & 1.8 \\ \hline \hbox{Henri-Martin} & 21.8 & 1.7 & 21.2 & 2.1 & 22.7 & 1.7 & 21.8 & 1.8 \\ \hline \hbox{Gare du Nord} & 3.5 & 1.9 & 3.9 & 1.4 & 4.3 & 1.9 & 4.4 & 2.2 \\ \hline \hbox{Saint-Honoré} & 3.8 & 1.9 & 3.3 & 1.9 & 4.2 & 1.9 & 4.1 & 1.5 \\ \hline \hbox{La Bourse} & 2.9 & 1.5 & 2.4 & 1.4 & 2.5 & 1.6 & 3.1 & 1.8 \\ \hline \hbox{Cie des Eaux} & .7 & 1.7 & .8 & 1.7 & .9 & 1.6 & 1 & 1.7 \\ \hline \hbox{La Fayette} & -.8 & 1.8 & 0 & 2 & -.5 & 1.6 & -.1 & 1.7 \\ \hline \hbox{Allez en Prison} & .3 & 1.9 & -.2 & 1.7 & .8 & 1.7 & .3 & 2 \\ \hline \hbox{Nombre moyen par case}& 2467.1 & & 2465.5 & & 2624.3 & & 2618.9 & \\ \hline \end{array}$$ $$\begin{array}{|l|l|l|l|l|l|l|l|l|}\hline & \hbox{CP} && \hbox{${\urcorner}$CP} && \hbox{C${\urcorner}$P} && \hbox{${\urcorner}$C${\urcorner}$P}&\\ \hline \hbox{Breteuil} & 1.2 & 1.9 & .8 & 1.8 & 1.5 & 1.5 & 1.2 & 1.7 \\ \hline \hbox{Foch} & -1.5 & 1.7 & -2 & 1.6 & -1.7 & 2 & -1.2 & 1.7 \\ \hline \hbox{Caisse de Communauté} & .4 & 2 & .1 & 1.9 & .6 & 1.7 & .8 & 2 \\ \hline \hbox{Capucines} & -7.5 & 1.8 & -7 & 1.6 & -7.2 & 1.8 & -7.5 & 1.7 \\ \hline \hbox{Gare Saint-Lazare} & -10.1 & 1.8 & -10 & 1.6 & -10.1 & 1.8 & -9.9 & 1.8 \\ \hline \hbox{Carte Chance} & -14.5 & 1.8 & -13.9 & 1.8 & -13.9 & 1.6 & -14.2 & 1.5 \\ \hline \hbox{Champs-élysées} & -18.6 & 1.6 & -18.8 & 1.8 & -18.4 & 1.5 & -18.4 & 1.8 \\ \hline \hbox{Taxe de Luxe} & -18.8 & 1.5 & -17.8 & 1.6 & -18.2 & 1.9 & -17.9 & 1.7 \\ \hline \hbox{La Paix} & 0 & 1.4 & -.3 & 1.5 & -.2 & 1.5 & -.8 & 1.4 \\ \hline \hbox{Nombre moyen par case}& 2467.1 & & 2465.5 & & 2624.3 & & 2618.9 & \\ \hline \end{array}$$
On voit que le nombre moyen théorique de passages par une case est plus bas dans les deux premières combinaisons de stratégie que dans les deux dernières. C'est tout à fait normal : dans les deux premières combinaisons (CP et $\urcorner$CP), on reste en moyenne plus longtemps en prison.
On peut observer des disparités d'une case à une autre, y compris à l'intérieur d'un même lotissement. Les tableaux ci-avant parlent d'eux-même mais disons que parmi les cases appartenant à des lotissements, la plus intéressante est l'avenue Henri-Martin qui est 20% plus fréquentée qu'une case équiprobable, et la moins intéressante est l'avenue des Champs-Élysées qui est presque 20% moins fréquentée qu'une case équiprobable. Selon que l'on ait choisi l'option P ou l'option \urcornerP, la probabilité de sortir de prison avec un double diffère. Les doubles possibles sont 2, 4, 6, 8, 10 et 12. En partant de la prison, on tombe sur les cases Cie d'Électricité, Paradis, Mozart, Saint-Michel, Parc Gratuit et la case "Chance" juste après Matignon : toutes ces cases ont un poids statistique égal ou plus élevé dans la stratégie P.
Toutes les cases des lotissements orange et rouge sont intéressantes, et on peut dores et déjà dire que ce sont les lotissements les plus intéressants. Cela sera confirmé ci-après quand on présentera les résultats par groupe.

4  Les résultats par groupe

Puisqu'il s'agit d'un article mathématique, nous allons quand même caser un théorème. Pour cela, nous allons commencer par introduire la notion de poids statistique d'un groupe de cases.
Soient $N$ cases fixées ($N$ étant compris entre 1 et 41) : $N=3$ ou $N=2$ par exemple pour un lotissement. Imaginons que nous fassions une simulation sur ordinateur (donc 50 fois 1000 parties de 100 tours). Supposons qu'au cours de cette simulation, la case numéro $i$ du groupe ($i$ variant de $1$ à $N$) soit fréquentée $c_i^1$ fois, puis $c_i^2$ fois, ... puis $c_i^{50}$ fois (les exposants ne sont pas des puissances ici mais des indices). Notre groupe de $N$ cases a été fréquenté $\sum_{i=1}^N c_i^1$ fois, puis $\sum_{i=1}^N c_i^2$ fois, ... puis $\sum_{i=1}^N c_i^{50}$ fois. Supposons que le nombre total de tours joués pendant cette simulation soit de $C$ : dans le cas équiprobable, chacun des nombres précédents devrait alors être égal à $\frac{NC}{41*50}$ fois. Notons $m$ la moyenne arithmétique de cette série de 50 nombres et $\sigma$ son écart-type. Posons alors $$\widetilde{m}=\frac{m - \frac{NC}{41*50}}{\frac{NC}{41*50}}\hbox{, }\widetilde{\sigma}=\frac{\sigma}{\left(\frac{NC}{41*50}\right)}.$$ Le couple $(\widetilde{m},\widetilde{\sigma})$ sera appelé le poids statistique du groupe. Il a la même interprétation que celle donnée ci-avant dans le cas d'une case et c'est une grandeur qui a le mérite d'être parlante pour le joueur (et le lecteur). Par exemple, le poids statistique du lotissement rouge est dans la simulation 1 (9.9 %, 1.1 %) (cf ci-après). Cela signifie que le lotissement rouge est 9.9% de fois plus fréquenté qu'un lotissement de $3$ cases dans le cas équiprobable.
Voici maintenant l'unique théorème de ce papier :
Proposition 1 Soit un groupe de $N$ cases. Soit $(\widetilde{m_i},\widetilde{\sigma_i})$ le poids statistique de la $i$-ème case du groupe ($i$ variant de 1 à $N$) et soit $(\widetilde{m},\widetilde{\sigma})$ le poids statistique du groupe. Alors $\widetilde{m}$ est la moyenne arithmétique des $\widetilde{m_i}$.
[Preuve de ce fabuleux théorème] Avec les notations ci-avant, on note $m_i$ (resp. $\sigma_i$) la moyenne arithmétique (resp. l'écart-type) de la série $(c_i^1,c_i^2,\ldots, c_i^{50})$. On a donc pour chaque $i$ les égalités $$\widetilde{m_i}=\frac{m_i - \frac{C}{41*50}}{\frac{C}{41*50}}.$$ Comme $\sum_{i=1}^N 50m_i = 50m$ alors $$ \widetilde{m}=\frac{m - \frac{NC}{41*50}}{\frac{NC}{41*50}} = \frac{\sum_{i=1}^N 50m_i - \frac{50NC}{41*50}}{\frac{50NC}{41*50}}= \frac{\sum_{i=1}^N (m_i - \frac{C}{41*50})}{\frac{NC}{41*50}}=\frac{\sum_{i=1}^N \widetilde{m_i}}{N}.$$
Il n'y a malheureusement pas de relations simples entre $\widetilde{\sigma}$ et les $\widetilde{\sigma_i}$ : en général, la variance (le carré de l'écart-type) d'une somme de variables aléatoires indépendantes est la somme des variances de chaque variable aléatoire : mais ici, chaque variable aléatoire correspondrait au nombre de passages par une case donnée au bout de 100000 tours et ces variables aléatoires ne sont clairement pas indépendantes.
Pour calculer le poids statistique d'un groupe, donc pas seulement les moyennes arithmétiques mais aussi les écarts-type, il faut donc reprendre les résultats bruts et faire un calcul direct. Le programme donné en annexe (section ) se débrouille très bien pour faire tout ça. Voici finalement le tableau des résultats par groupe (voir la section 2 pour la signification des couleurs, qui peuvent varier d'une édition du Monopoly à une autre) :
$$\begin{array}{|l|l|l|l|l|l|l|l|l|}\hline & \hbox{CP} && \hbox{${\urcorner}$CP} && \hbox{C${\urcorner}$P} && \hbox{${\urcorner}$C${\urcorner}$P}&\\ \hline \hbox{Les gares} & -1.4 & 1 & -1.5 & .8 & 0 & .8 & -.3 & .9 \\ \hline \hbox{Les Cies} & -3 & 1.4 & -2.6 & 1.3 & -6.1 & 1.2 & -5.8 & 1.2 \\ \hline \hbox{Brun} & -8.7 & 1.1 & -8.4 & 1.1 & -8.6 & .9 & -7.9 & 1.2 \\ \hline \hbox{Bleu clair} & -10.8 & .9 & -10.1 & 1 & -11 & .8 & -10.6 & .9 \\ \hline \hbox{Violet} & -3.4 & .9 & -3.8 & .9 & -4.2 & .7 & -4.2 & .9 \\ \hline \hbox{Orange} & 11.6 & .9 & 11.4 & 1 & 11.5 & 1 & 11.3 & 1 \\ \hline \hbox{Rouge} & 9.9 & 1.1 & 9.8 & .8 & 11.3 & .9 & 11 & .9 \\ \hline \hbox{Jaune} & 2 & .9 & 1.9 & .8 & 2.1 & .8 & 2.3 & .8 \\ \hline \hbox{Vert} & -2.6 & .8 & -2.7 & .8 & -2.4 & .9 & -2.4 & .8 \\ \hline \hbox{Bleu foncé} & -9.3 & 1 & -9.6 & 1 & -9.3 & .8 & -9.6 & 1 \\ \hline \hbox{Nombre moyen par case}& 2467.1 & & 2465.5 & & 2624.3 & & 2618.9 & \\ \hline \end{array}$$
Faisons quelques commentaires maintenant. Le groupe des quatre gares est très légèrement moins fréquenté qu'un groupe idéal qui serait composé de quatre cases équiprobables. Les lotissements les plus intéressants (parmi les lotissements de trois cases) sont clairement les lotissements rouge et orange : tous les joueurs de Monopoly en ont, je pense, l'intuition. Parmi les groupes de deux cases, les bruns et les bleus foncés sont au même niveau, et le groupe formé des deux compagnies (eau et électricité) est légèrement meilleur.

5  Conclusion

Contrairement à ce que déclare Ian Stewart dans le numéro de Juin 1996 de "Pour La Science", les cases du Monopoly ne sont donc pas équiprobables. En fait, dans son article, Ian Stewart ne tient compte que des jets de dés. Il ne tient pas compte des deux piles de cartes ("Chance" et "Caisse de Communauté") et des déplacements qu'elles engendrent, ni de la règle des trois doubles successifs. Il y a donc de légères fluctuations d'une case à une autre et cela fait finalement tout le pigment du jeu (avec l'aspect financier et l'aspect jeu de société).

6  Annexe : le programme PERL

Il est difficile d'expliquer un programme. Je pense qu'il y a suffisamment de commentaires pour qu'il soit lisible. Il n'est certainement pas optimisé : sa seule qualité est qu'il fonctionne. Il se lance dans une ligne de commande. Le résultat se trouve dans le fichier $fichier_tex sous forme d'un tableau prêt à être inséré dans un environnement array d'un fichier LATEX . Une dernière remarque : il n'y a pas de fautes d'orthographes dans le programme : on écrit bien rominet et pas gros minet.
#!/bin/perl -s

srand;
$melange = 10000; # nombre de transpositions aléatoires pour 
                  # mélanger les cartes.

# nombre de tests effectué : $fois fois $coup/$duree_partie parties 
# de $duree_partie chacune (cela signifie entre autre que la variable 
# $position est remise \`a zéro tous les $duree_partie coups.

$fois = 50;
$coup = 100000;
$duree_partie = 100;

# choix des stratégies : 
# $prison = 0 : on ne reste jamais en prison
# $prison = 1 : on reste en prison jusqu'au troisi\`eme tour ou bien 
# jusqu'\`a l'obtention d'un double
# 
# Il y a une carte "Caisse de Communauté" qui propose le choix 
# suivant : payer une amende ou bien tirer une carte "Chance"
# $tirage_chance = 0 : ne jamais choisir de tirer une carte "Chance"
# $tirage_chance = 1 : toujours choisir de tirer une carte "Chance"

# nom du fichier tampon et des fichiers qui doivent contenir les 
# calculs.

$fichier = "tableau.txt";
$fichier_tampon = "tableau_tmp.txt";
$fichier_tex = "tableau.tex";

# Nom des différentes cases 
@case = ("Case Départ",            # 0
         "Belleville",             # 1
         "Caisse de Communauté",   # 2
         "Lecourbe",               # 3
         \"Impôts",                 # 4
         "Gare Montparnasse",      # 5
         "Vaugirard",              # 6
         "Carte Chance",           # 7
         "Courcelles",             # 8
         "Républiques",            # 9
         "Simple Visite",          # 10
         "La Villette",            # 11
         "Cie électricité",        # 12
         "Neuilly",                # 13
         "Paradis",                # 14
         "Gare de Lyon",           # 15
         "Mozart",                 # 16
         "Caisse de Communauté",   # 17 
         "Saint-Michel",           # 18
         "Pigalle",                # 19
         "Parc Gratuit",           # 20
         "Matignon",               # 21
         "Carte Chance",           # 22
         "Malesherbes",            # 23
         "Henri-Martin",           # 24
         "Gare du Nord",           # 25
         "Saint-Honoré",           # 26
         "La Bourse",              # 27
         "Cie des Eaux",           # 28
         "La Fayette",             # 29
         \"Allez en Prison",        # 30
         "Breteuil",               # 31
         "Foch",                   # 32
         "Caisse de Communauté",   # 33
         "Capucines",              # 34
         "Gare Saint-Lazare",      # 35
         "Carte Chance",           # 36
         "Champs-élysées",         # 37
         "Taxe de Luxe",           # 38
         "La Paix",                # 39
         "Prison",                 # 40
         "Les gares",              # 5 + 15 + 25 + 35 (41)
         "Les Cies",               # 12 + 28 (42)
         "Brun",                   # 1 + 3 (43)
         "Bleu clair",             # 6 + 8 + 9 (44)
         "Violet",                 # 11 + 13 + 14 (45)
         \"Orange",                 # 16 + 18 + 19 (46)
         "Rouge",                  # 21 + 23 + 24 (47)
         "Jaune",                  # 26 + 27 + 29 (48)
         "Vert",                   # 31 + 32 + 34 (49)
         "Bleu foncé"              # 37 + 39 (50)
         );

# initialisation de $fichier_tex (qui va contenir le tableau).
&executer("rm $fichier_tex");
open(titi,">$fichier_tex");
for $i (0..50) {
    print titi "\\hbox\{$case[$i]\} \n"
    };
close(titi);

#fabrication d'un pattern
$pattern = "\^.*";
for $i (1..$fois) {
    $pattern = $pattern."\\s(\\d+)"
    };
$pattern = $pattern.".*\$";

$theorie = 0;

print "Stratégie CP\n";
$prison = 1; $tirage_chance = 1; &simulation;
print "Stratégie CnonP\n";
$prison = 1; $tirage_chance = 0; &simulation;
print "Stratégie nonCP\n";
$prison = 0; $tirage_chance = 1; &simulation;
print "Stratégie nonCnonP\n";
$prison = 0; $tirage_chance = 0; &simulation;

# On rajoute des \\ pour la syntaxe de l'environnement array

open(titi,"$fichier_tex");
open(rominet,">$fichier_tampon");
while(<titi>) {
    s/(.+)$/$1 \\\\/;
    print rominet $_;
    };
close(rominet);
close(titi);

&executer("mv $fichier_tampon $fichier_tex");

###################################################################
###################################################################

sub simulation {

#simulation proprement dite
# initialisation de $fichier : il doit impérativement contenir 51 
# lignes vides.

    &executer("rm $fichier");
    open(titi,">$fichier");
    for $i (0..50) {
        print titi " \n"
        };
    
    close(titi);

    for $i (1..$fois) {
        srand;
        print "Simulation numéro $i\n";
        $theorie = $theorie + &monopoly
        };
    
    $theorie = $theorie/$fois/41;
    
#Fabrication du tableau TeX correctement formatté.
    open(titi,"$fichier");
    open(tex,"$fichier_tex");
    open(rominet,">$fichier_tampon");
    $index = 0;
    while(<titi>) {
        /$pattern/;
        for $i (1..$fois) {
            $a[$i] = $$i};
        $moyenne = 0;
        for $i (1..$fois) {
            $moyenne = $moyenne + $a[$i]};
        $moyenne = $moyenne / $fois;
        $grp = 1;
        if ($index == 41) {
            $grp = 4
            };
        if ($index == 42 || $index == 43 || $index == 50) {
            $grp = 2
            };
        if ($index >= 44 && $index <= 49) {
            $grp = 3
            };
        $c = int(1000*(($moyenne/($grp*$theorie))-1))/10;
        $moyenne = int(10*$moyenne)/10;
        $ecart_type = 0;
        for $i (1..$fois) {
            $ecart_type = $ecart_type + abs($a[$i]-$moyenne)
                *abs($a[$i]-$moyenne)};
        $ecart_type = sqrt($ecart_type/$fois);
        $d = int(1000*$ecart_type/($grp*$theorie))/10;
        $ecart_type = int(10*$ecart_type)/10;
        $ligne_tex = <tex>;
        $ligne_tex =~ s/(.+)$/$1 \& $c \& $d/;
        print rominet "$ligne_tex";
        $index += 1
        };
    $theorie = int(10*$theorie)/10;
    $ligne_tex = <tex>;
    $ligne_tex =~ s/(.*)$/$1 $theorie \& \&\n/;
    print rominet "$ligne_tex";
    close(titi);
    close(rominet);
    close(tex);
    &executer("mv $fichier_tampon $fichier_tex");
    };
    
###################################################################
###################################################################

sub executer {
    open(execution,"$_[0] |");
    <execution>;
    close(execution)
    };


# +1 modulo 16

sub p16 {
    local($i) = $_[0];
    $i += 1;
    if ($i == 16) {return 0};
    return $i};

###################################################################
###################################################################

sub jouer_coup {
    local($pos) = $_[0];
    local($de1) = $_[1];
    local($de2) = $_[2];
    local($tirage1);
    local($tirage2);

    if ($de1 == $de2) {
        $nombre_double +=1
        };
    if ($de1 != $de2) {
        $nombre_double = 0
        };

    if ($nombre_double ==3) {
        $nombre_double = 0;
        $frequentation[40] +=1;
        return 96
        };

    if ($pos >= 96) {
        if ($pos == 96 && $de1 != $de2 && $prison == 1) {
            $pos = 97}
        elsif ($pos == 97 && $de1 != $de2 && $prison == 1) {
            $pos = 98}
        else {
            $pos = 10 + $de1 + $de2}
    }
    else {
        $pos += $de1 + $de2;
        if ($pos >= 40) {
            $pos -= 40
            }
        };

    if ($pos <= 39) {
        $frequentation[$pos] +=1};

    if ($pos >= 96) {return $pos};

    if ($case[$pos] eq "Caisse de Communauté") {
                $tirage1 = $communaute[$pointeur_communaute];
                $pointeur_communaute = &p16($pointeur_communaute);
                if ($tirage1 == 95) {
                    if ($tirage_chance == 1) {
                        $tirage2 = $chance[$pointeur_chance];
                        $pointeur_chance = &p16($pointeur_chance);
                        if ($tirage2 == 96) {
                            $frequentation[40] +=1;
                            return 96};
                        if ($tirage2 == 99) {return $pos} 
                        elsif ($tirage2 == -3) {
                            return &jouer_coup($pos,-3,0)}
                        else {
                            return &jouer_coup($tirage2,0,0)
                              }
                    } 
                    else {
                        return $pos}
                };
                if ($tirage1 == 99) {
                    return $pos};
                if ($tirage1 == 96) {
                    $frequentation[40] +=1;
                    return 96};
                &jouer_coup($tirage1,0,0)
                };
    if ($case[$pos] eq "Carte Chance") {
        $tirage2 = $chance[$pointeur_chance];
        $pointeur_chance = &p16($pointeur_chance);
        if ($tirage2 == 96) {
            $frequentation[40] +=1;
            return 96};
        if ($tirage2 == 99) {return $pos} 
        elsif ($tirage2 == -3) {
            return &jouer_coup($pos,-3,0)}
        else {
            return &jouer_coup($tirage2,0,0)}};
    if ($case[$pos] eq \"Allez en Prison") {
        $frequentation[40] +=1;
        return 96};
    return $pos
    };

###################################################################
###################################################################

sub monopoly {
    local(@communaute) = (1,96,0,95,
                          99,99,99,99,99,99,99,99,99,99,99,99);
    local(@chance) = (96,24,11,39,15,0,-3,
                      99,99,99,99,99,99,99,99,99);
    local($i);
    local($j);
    local($c1);
    local($c2);
    local($ligne);
    local($tmp);
    local($coup_reel);
    local($position) = 0; # on commence sur la case départ.
    # 96 est par convention le premier tour en prison.
    # 97 est par convention le deuxi\`eme tour en prison.
    # 98 est par convention le troisi\`eme tour en prison.
    # 10 est la simple visite.
    # 95 représente le tirage de la carte "Caisse de Communauté" 
    # qui propose de choisir entre une amende et le tirage d'une 
    # carte "Chance"
    # 99 signifie : aucune action (au niveau des déplacements)
    # -3 correspond \`a la carte "Chances" : reculez de trois cases.
    
    local($pointeur_chance) = 0;
    local($pointeur_communaute) = 0;
    
    # dans le tableau ci-dessous, le 41-i\`eme élément 
    # représente la fréquentation en prison. Les 10 
    # derni\`eres cases sont fictives et correspondent \`a des 
    # groupes intéressants
    # cf plus haut pour la signification.
    local(@frequentation) = (0,0,0,0,0,0,0,0,0,0,
                             0,0,0,0,0,0,0,0,0,0,
                             0,0,0,0,0,0,0,0,0,0,
                             0,0,0,0,0,0,0,0,0,0,
                             0,
                             0,0,0,0,0,0,0,0,0,0);

    # Mélange des cartes : 

    print "Mélange des cartes Chances...\n";
    srand;
    $i = 0;
    while($i<$melange){
        $c1 = int(16*rand);
        $c2 =  int(16*rand);
        $tmp = $chance[$c1]; 
        $chance[$c1]=$chance[$c2];
        $chance[$c2]=$tmp;
        $i += 1};

    print "Mélange des cartes Caisse de Communauté...\n";
    srand;
    $i = 0;
    while($i<$melange){
        $c1 = int(16*rand);
        $c2 =  int(16*rand);
        $tmp = $communaute[$c1]; 
        $communaute[$c1]=$communaute[$c2];
        $communaute[$c2]=$tmp;
        $i += 1}; 

    print "C'est parti pour une série de $coup coups...\n";
    $i = 0; 
    $j = 0; 
    $nombre_double = 0; 
    srand;
    while($i<$coup) {
        $i +=1; $j += 1;
        if ($j == $duree_partie) {
            $position = 0;
            $j = 0
            };
        $position = &jouer_coup($position,int(6*rand) + 1,
                                int(6*rand) + 1)
        };

    # mettre les fréquentations des différents groupes ICI !
    $frequentation[41] = $frequentation[5] + $frequentation[15] + 
        $frequentation[25] + $frequentation[35];

    $frequentation[42] = $frequentation[12] + $frequentation[28];
    $frequentation[43] = $frequentation[1] + $frequentation[3];
    $frequentation[50] = $frequentation[37] + $frequentation[39];

    $frequentation[44] = $frequentation[6] + $frequentation[8] 
        + $frequentation[9];
    $frequentation[45] = $frequentation[11] + $frequentation[13] 
        + $frequentation[14];
    $frequentation[46] = $frequentation[16] + $frequentation[18] 
        + $frequentation[19];
    $frequentation[47] = $frequentation[21] + $frequentation[23] 
        + $frequentation[24];
    $frequentation[48] = $frequentation[26] + $frequentation[27] 
        + $frequentation[29];
    $frequentation[49] = $frequentation[31] + $frequentation[32] 
        + $frequentation[34];


    print "Stockage des résultats intermédiaires...\n";
    $ligne = 0; 
    open(titi,"$fichier");
    open(rominet,">$fichier_tampon");
    while(<titi>) {
        s/(.+)$/$1 $frequentation[$ligne]/;
        print rominet $_;
        $ligne += 1
        };
    close(rominet);
    close(titi);
    
    &executer("cp $fichier_tampon $fichier");
    <titi>;
    close(titi);

    $coup_reel = 0;
    for $i (0..40) {
        $coup_reel = $coup_reel + $frequentation[$i]
        };

    return($coup_reel)
};