#!/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() { 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() { /$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 = ; $ligne_tex =~ s/(.+)$/$1 \& $c \& $d/; print rominet "$ligne_tex"; $index += 1 }; $theorie = int(10*$theorie)/10; $ligne_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] |"); ; 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() { s/(.+)$/$1 $frequentation[$ligne]/; print rominet $_; $ligne += 1 }; close(rominet); close(titi); &executer("cp $fichier_tampon $fichier"); ; close(titi); $coup_reel = 0; for $i (0..40) { $coup_reel = $coup_reel + $frequentation[$i] }; return($coup_reel) };