2009-10-14 11 views
4

J'ai vu ce code dans a comment pour l'article "Never-ending Shuffled Sequence". Je comprends la prémisse de base, mais je ne sais pas comment cela fonctionne. La plus grande explication dont j'ai besoin est des deux premières lignes de la boucle while.Comment fonctionne ce code MATLAB? (probabilités et séquences aléatoires)

(Parce qu'il est écrit dans Matlab, je ne peux que deviner comment fonctionne ce code.)

probabilities = [1 1 1 1 1 1]; 
unrandomness = 1; 
while true 
    cumprob = cumsum(probabilities) ./ sum(probabilities); 
    roll = find(cumprob >= rand, 1) 
    probabilities = probabilities + unrandomness; 
    probabilities(roll) = probabilities(roll) - 6*unrandomness; 
    if min(probabilities) < 0 
     probabilities = probabilities - min(probabilities); 
    end 
end 

Répondre

12

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] 
    

    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.

+0

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. –

+0

Merci beaucoup, vous avez donné une bien meilleure explication que prévu. –

+0

Content de t'aider! =) – gnovice