probabilities
ベクトルは、1から6までの数字が選択される可能性の相対的な重みを表します。最初は、全員が同じように選ばれる可能性があります。whileループの各行をステップスルーして、その機能を説明します。
probabilities
whileループ内の最初の行は、ベクトルから累積確率を作成します。CUMSUM関数は、ベクトルの長さに沿った累積合計を返すために使用され、これはベクトルの合計合計(SUM関数を使用して検出)で除算されます。ループの最初のパスでは、cumprob
次の値になります。
0.1667 0.3333 0.5000 0.6667 0.8333 1.0000
これらは、0から1までの乱数が入る「ビン」を作成することに注意してください。特定のビン内に数字が入る確率は、そのビンの幅に等しいため、6分の1(0.1667)の確率で乱数は、最初のビン(0から0.1667)、または2番目のビン(0.1667から0.3333)などに分類されます。
whileループ内の2行目は、乱数を選択し(RANDcumprob
関数を使用) 、その値よりも大きい最初の要素のインデックスを検索します( FIND関数を使用)。したがってroll
、値は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
が正であることを確認するためにあります。ベクトルの最小値(MIN関数を使用して検出)がゼロ未満の場合、この値はベクトルのすべての要素から減算されます。これにより、cumprob
ベクトルの値が常に0から1の間になるようになります。
while true
ステートメントをに置き換えた場合、各反復の最後にベクトルと値をfor i = 1:6
表示し、コードを数回実行すると、コードがどのように機能するかを確認できます。これは、1から6までの数字のそれぞれを1回引く6つのロールのそのようなセットの1つです。probabilities
roll
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までの数字はすべてもう一度選択される可能性が同じです。