该probabilities
向量表示将选择数字 1 到 6 的可能性的相对权重。一开始,他们都有平等的机会被选中。我将逐步介绍 while 循环的每一行,解释它的作用:
while 循环中的第一行从probabilities
向量创建一个累积概率。CUMSUM函数用于返回沿向量长度的累积和,并将其除以向量的总和(使用SUM函数找到)。在第一次通过循环时,cumprob
将具有以下值:
0.1667 0.3333 0.5000 0.6667 0.8333 1.0000
请注意,这些会创建从 0 到 1 的随机数可以落入的“箱”。数字落入给定箱的概率等于该箱的宽度,因此有六分之一(0.1667)的机会随机抽取的数字将落在第一个 bin(从 0 到 0.1667)或第二个 bin(从 0.1667 到 0.3333)等。
while 循环中的第二行选择一个随机数(使用RANDcumprob
函数)并找到大于该值的第一个元素的索引(使用FIND函数)。因此,该roll
值是一个从 1 到 6 的数字。
while 循环中的第三行通过向上移动所有相对权重来增加“非随机性”,使所有数字的概率更接近相等。考虑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 循环中的第四行基本上与前一行相反,它显着降低了刚刚出现的任何数字的相对权重,使其不太可能在后续循环中发生。由于前一行不断尝试使所有数字的发生概率恢复到相等的影响,这种降低的发生可能性将是短暂的。
请注意,从 的一个元素中减去的量probabilities
等于添加到前一行中所有元素的总量,导致probabilities
向量总和的净变化为零。这使值保持在probabilities
有界,使它们不只是不断增长和增长。
while 循环末尾的 if 语句只是为了确保其中的所有数字probabilities
都是正数。如果向量的最小值(使用MIN函数找到)小于零,则从向量的每个元素中减去该值。这将确保cumprob
向量始终具有介于 0 和 1 之间的值。
如果将while true
语句替换为for i = 1:6
,在每次迭代结束时显示probabilities
向量和roll
值,然后运行代码几次,您可以看到代码是如何完成它的工作的。这是一组这样的一组 6 卷,可以将数字 1 到 6 中的每一个抽出一次:
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 再次被选中的可能性相同。