この MATLAB コードはどのように機能するのでしょうか?(確率とランダムシーケンス)

StackOverflow https://stackoverflow.com/questions/1566150

質問

このコードを見たのは コメント 記事に関しては「終わりのないシャッフルシーケンス」。基本的な前提は理解できましたが、それがどのように機能するかはわかりません。 私が必要とする最大の説明は、while ループの最初の 2 行です。

(MATLAB で書かれているため、このコードがどのように機能するかは推測することしかできません。)

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
役に立ちましたか?

解決

probabilities ベクトルは、1 ~ 6 の数字が選択される可能性の相対的な重みを表します。最初は、全員が平等に選ばれるチャンスがあります。while ループの各行を順に見て、その動作を説明します。

  • while ループ内の最初の行は、累積確率を作成します。 probabilities ベクター。の カムサム 関数は、ベクトルの長さに沿った累積合計を返すために使用され、これをベクトルの総和で割ります (次の関数を使用して求められます)。 関数)。ループを最初に通過するとき、 cumprob 次の値になります。

    0.1667    0.3333    0.5000    0.6667    0.8333    1.0000
    

    これらは、0 から 1 までの乱数が入る「ビン」を作成することに注意してください。数値が特定のビンに入る確率は、そのビンの幅に等しいため、ランダムに抽出された数値が最初のビン (0 ~ 0.1667) に入る確率は 6 分の 1 (0.1667) です。 2 番目のビン (0.1667 から 0.3333) など。

  • while ループ内の 2 行目は、( ランド 関数) の最初の要素のインデックスを見つけます。 cumprob それはその値よりも大きいです( 探す 関数)。の roll したがって、value は 1 から 6 までの数値になります。

  • while ループ内の 3 行目は、すべての相対的な重みを上方にシフトすることで「不ランダム性」を追加し、確率をすべての数値で等しい値に少し近づけます。次の例を考えてみましょう。 probabilities は次の形式になります。

    [x x x 1 x x]
    

    どこ x 1 より大きい値です。この時点で、値 4 が選択される確率は次のようになります。 1/(5*x+1). 。すべての要素に 1 を加えると、その確率は次のようになります。 2/(5*x+7). 。のために x = 3, 、4が発生する確率 増加する 0.0625 ~ 0.0909、その他の数値が発生する確率 減少する 0.1875から0.1818まで。したがって、この「不規則性」は確率を正規化するように作用します。

  • while ループ内の 4 行目は、基本的に前の行とは逆のことを行い、発生した数値の相対的な重みを大幅に下げ、後続のループで発生する可能性を低くします。この発生確率の低下は、すべての数値の発生確率を常に同じに戻そうとする前の行の効果により、長くは続かないでしょう。

    の 1 つの要素から減算される量に注意してください。 probabilities は、前の行のすべての要素に追加された合計量に等しく、合計の純変化はゼロになります。 probabilities ベクター。これにより、値が保持されます probabilities 成長を続けるだけではないように制限されています。

  • while ループの最後の if ステートメントは、単にすべての数値が正しいかどうかを確認するためにあります。 probabilities ポジティブです。ベクトルの最小値 ( 最小 function) が 0 より小さい場合、この値がベクトルのすべての要素から減算されます。これにより、 cumprob ベクトルは常に 0 から 1 までの値を持ちます。

交換する場合は、 while true とのステートメント for i = 1:6, を表示します。 probabilities ベクトルと roll 各反復の最後に値を確認し、コードを数回実行すると、コードがどのように機能するかを確認できます。以下は、1 から 6 までの数字を 1 回ずつ引く 6 ロールのセットの 1 つです。

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

最終的な値がどのように変化するかに注目してください。 probabilities これは、その時点で 1 から 6 までの数字がすべて再び選択される可能性が等しいことを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top