Présentation
On va chercher à déterminer les probabilités de jets de dés par force brute.
Jet de dé simple avec relance à 10
La fonction
rand(int min, int max)
permet de générer un nombre aléatoire compris entre min et max.
Comme il s'agit de dés à 10 faces, on utilisera
rand(1,10);
.
Si le jet fait 10, le dé est relancé et le résultat est ajouté au 10 obtenu précedemment (et ainsi de suite en cas d'autre 10).
Jet de dés Roll & Keep
Il s'agit de jets de dés tels que décrits dans le système de jeu Légende des cinq anneaux. On lance aléatoirement n dé à 10 faces avec le système décrit précédemment. On garde les m meilleurs jets qu'on additionne.
Par exemple pour 3g2, on jette 3 dés et on garde les deux meilleurs :
- 8
- 3
- 10+3 (on a fait 10, puis la relance a donné 3)
On va ici garder le 8 et le 13 ce qui nous fait un total de 21.
Seuil de relance
Dans les exemples précédents, le seuil de relance était fixé à 10. Hors ce seuil peut varier. Si on fixe le seuil à 8 pour un 3g2, on aura par exemple :
- 9+8+2 (on a fait 9 puis 8 et enfin 2)
- 3
- 7
Ce qui nous fait un total de 26
Force brute
En lançant un nombre suffisament important (par exemple 100 000) de jets de dés, on obtient des résultats représentant la probabilité approximative des différents résultats
On utilisera Google Charts pour simplifier.
<div id="results"></div> <script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1','packages':['corechart']}]}"></script> <script type="text/javascript"> google.load('visualization', '1', { packages: ['corechart'] }); google.setOnLoadCallback(drawChart); function drawChart() { var data = new google.visualization.DataTable(); data.addColumn('number', 'Résultat du jet'); data.addColumn('number', 'Occurences'); data .addRows([ // Insérer les données ici // Sous la forme [18,1], [20,4], [21,1] // etc ]); var options = { width : 900, height : 563, hAxis : { title : 'Résultat du jet : ', // Vous personnalisez le titre ici }, vAxis: { title: 'Occurences' } }; var chart = new google.visualization.ColumnChart(document .getElementById('results')); chart.draw(data, options); } </script>
Simulation
Indications
Il s'agit ici d'indications concernant la réalisation. Les étudiants peuvent déroger à ces lignes directrices.
Classe Dice.php
- Attribut
reroll
indiquant le seuil de relance. Cet attribut est initialisé dans le constructeur - Méthode
simple_roll
qui génère un nombre aléatoire entre 1 et 10 - Méthode
roll
qui appellesimple_roll
mais si la valeur générée est supérieure ou égale àreroll
, alors on additionne un nouveau jet
Classe RollAndKeep.php
- Attribut
reroll
indiquant le seuil de relance. Cet attribut est initialisé dans le constructeur - Attribut
nb_roll
indiquant le nombre de dés lancés. Cet attribut est initialisé dans le constructeur - Attribut
nb_keep
indiquant le nombre de dés gardés. Cet attribut est initialisé dans le constructeur - Attribut
rolls
permettant de stocker les résultats des dés (tableau) - Une méthode
run
- Initialise une instance de
Dice
- Initialise le tableau
rolls
- Appelle la méthode
roll
pournb_roll
fois, en stockant le résultat dansrolls
- Trie le tableau en ordre inverse avec
rsort
- Renvoie la somme des
nb_keep
premiers éléments du tableau trié - Exemple pour 6g3:
- Jets : 6 13 5 9 11 4
- Tableau trié : [13,11,9,6,5,4]
- Résultat : 13+11+9=33
- Initialise une instance de
Classe Simulation.php
- Attribut
reroll
indiquant le seuil de relance. Cet attribut est initialisé dans le constructeur - Attribut
nb_roll
indiquant le nombre de dés lancés. Cet attribut est initialisé dans le constructeur - Attribut
nb_keep
indiquant le nombre de dés gardés. Cet attribut est initialisé dans le constructeur - Attribut
nb
indiquant le nombre de jets simulés. Cet attribut est initialisé dans le constructeur - Attribut
rolls
permettant de stocker les résultats des jets (tableau associatif) - Méthode
run
- Initialise une instance de
RollAndKeep
- Effectue
nb
jets deRollAndKeep
- Stocke les résultats dans
rolls
sous forme associative :- Si la clé correspondant au résultat n'existe pas, elle est créée avec une valeur 1
- Si elle existe, la valeur correspondante est augmentée de 1
- Exemple :
- 11 : [11=>1]
- 18 : [11=>1,18=>1]
- 4 : [11=>1,18=>1,4=>1]
- 18 : [11=>1,18=>2,4=>1]
- On utilise la function
ksort
pour trier le tableau
- Initialise une instance de
-
Méthode
print_results
qui transforme le tableaurolls
pour le rendre compatible avec l'afficheur. avec l'exemple précédent, [11=>1,18=>2,4=>1] doit devenit [[4,1][11,1][18,2]]