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\'eatoires pour
# m\'elanger les cartes.
# nombre de tests effectu\'e : $fois fois $coup/$duree_partie parties
# de $duree_partie chacune (cela signifie entre autre que la variable
# $position est remise \`a z\'ero tous les $duree_partie coups.
$fois = 50;
$coup = 100000;
$duree_partie = 100;
# choix des strat\'egies :
# $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\'e" 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\'erentes cases
@case = ("Case D\'epart", # 0
"Belleville", # 1
"Caisse de Communaut\'e", # 2
"Lecourbe", # 3
"Imp\^ots", # 4
"Gare Montparnasse", # 5
"Vaugirard", # 6
"Carte Chance", # 7
"Courcelles", # 8
"R\'epubliques", # 9
"Simple Visite", # 10
"La Villette", # 11
"Cie \'Electricit\'e", # 12
"Neuilly", # 13
"Paradis", # 14
"Gare de Lyon", # 15
"Mozart", # 16
"Caisse de Communaut\'e", # 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\'e", # 26
"La Bourse", # 27
"Cie des Eaux", # 28
"La Fayette", # 29
"Allez en Prison", # 30
"Breteuil", # 31
"Foch", # 32
"Caisse de Communaut\'e", # 33
"Capucines", # 34
"Gare Saint-Lazare", # 35
"Carte Chance", # 36
"Champs-\'Elys\'ees", # 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\'e" # 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\'egie CP\n";
$prison = 1; $tirage_chance = 1; &simulation;
print "Strat\'egie CnonP\n";
$prison = 1; $tirage_chance = 0; &simulation;
print "Strat\'egie nonCP\n";
$prison = 0; $tirage_chance = 1; &simulation;
print "Strat\'egie 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\'erativement 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\'ero $i\n";
$theorie = $theorie + &monopoly
};
$theorie = $theorie/$fois/41;
#Fabrication du tableau TeX correctement formatt\'e.
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\'e") {
$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\'epart.
# 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\'esente le tirage de la carte "Caisse de Communaut\'e"
# qui propose de choisir entre une amende et le tirage d'une
# carte "Chance"
# 99 signifie : aucune action (au niveau des d\'eplacements)
# -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 \'el\'ement
# repr\'esente la fr\'equentation en prison. Les 10
# derni\`eres cases sont fictives et correspondent \`a des
# groupes int\'eressants
# 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\'elange des cartes :
print "M\'elange 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\'elange des cartes Caisse de Communaut\'e...\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\'erie 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\'equentations des diff\'erents 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\'esultats interm\'ediaires...\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)
};