Le vecteur probabilities
représente les poids relatifs à la probabilité que les numéros 1 à 6 seront sélectionnés. Au début, ils ont tous une chance égale d'être choisi. Je vais un pas à travers chaque ligne de la boucle tout en expliquant ce qu'il fait:
La première ligne dans la boucle while crée une probabilité cumulée à partir du vecteur probabilities
. La fonction CUMSUM est utilisée pour renvoyer une somme cumulative sur la longueur du vecteur, divisée par la somme totale du vecteur (trouvée à l'aide de la fonction SUM). Au premier passage dans la boucle, cumprob
aura ces valeurs.
0.1667 0.3333 0.5000 0.6667 0.8333 1.0000
Notez que ceux-ci créent « cases » qu'un nombre aléatoire de 0 à 1 peut tomber dans la probabilité qu'un nombre tombe dans un donné bin est égal à la largeur de cette case, donc il y a 1 chance sur 6 (0,1667) qu'un tirage au sort tombe dans la première case (de 0 à 0,1667), ou la seconde case (de 0,1667 à 0,3333), etc.
La deuxième ligne de la boucle while sélectionne un nombre aléatoire (à l'aide de la fonction RAND) et trouve l'index du premier élément de cumprob
supérieur à cette valeur (à l'aide du FIND fonction). La valeur roll
est donc un nombre compris entre 1 et 6. La troisième ligne de la boucle while ajoute "unrandomness" en déplaçant tous les poids relatifs vers le haut, rapprochant les probabilités d'être égales pour tous les nombres. Prenons l'exemple où probabilities
a la forme suivante:
[x x x 1 x x]
où x
est une valeur supérieure à 1. A ce stade, la probabilité que la valeur 4 est choisi est 1/(5*x+1)
. En ajoutant 1 à tous les éléments, cette probabilité devient 2/(5*x+7)
. Pour x = 3
, la probabilité de 4 apparaissant augmente de 0,0625 à 0,0909, tandis que la probabilité de voir apparaître un autre nombre diminue de 0,1875 à 0,1818. Cette "indiscipline" agit ainsi pour normaliser les probabilités.
La quatrième ligne de la boucle while fait essentiellement l'inverse de la ligne précédente en supprimant de manière significative le poids relatif de tout nombre qui vient de se produire, ce qui le rend moins probable pour les boucles suivantes. Cette probabilité réduite d'occurrence sera de courte durée en raison de l'effet de la ligne précédente essayant constamment de ramener les probabilités d'occurrence à l'égalité pour tous les nombres. Notez que le montant soustrait de l'élément probabilities
est égal au montant total ajouté à tous les éléments de la ligne précédente, ce qui entraîne une variation nette de zéro pour la somme totale du vecteur probabilities
.Cela permet de limiter les valeurs en probabilities
afin qu'elles ne continuent pas à croître et à croître.
L'instruction if à la fin de la boucle while est simplement là pour s'assurer que tous les nombres dans probabilities
sont positifs. Si la valeur minimale du vecteur (trouvée à l'aide de la fonction MIN) est inférieure à zéro, cette valeur est soustraite de chaque élément du vecteur. Cela fera en sorte le vecteur cumprob
a toujours des valeurs comprises entre 0 et 1.
Si vous remplacez la déclaration while true
avec for i = 1:6
, afficher le vecteur probabilities
et roll
valeur à la fin de chaque itération, et exécutez le un code Quelques fois, vous pouvez voir comment le code fait ce qu'il fait. Voici un tel ensemble de 6 rouleaux qui attire chacun des numéros 1 à 6 fois:
roll probabilities
5 | 6 6 6 6 0 6
|
4 | 7 7 7 1 1 7
|
2 | 8 2 8 2 2 8
|
1 | 3 3 9 3 3 9
|
3 | 4 4 4 4 4 10
|
6 | 5 5 5 5 5 5
Remarquez comment les valeurs finales dans probabilities
sont tous égaux, ce qui signifie que, à ce moment-là les numéros 1 à 6 ont tous un égal probabilité d'être choisi une fois de plus.
Pourriez-vous entrer dans une explication des deux premières lignes dans la boucle while? Je ne connais pas Matlab, donc 'cumsum' et' find' (d'autant plus qu'il semble y avoir une entrée booléenne) ont un but indéfini pour moi. –
Merci beaucoup, vous avez donné une bien meilleure explication que prévu. –
Content de t'aider! =) – gnovice