4

我在文章“ Never-ending Shuffled Sequence ”的评论中看到了这段代码。我了解基本前提,但我不知道它是如何工作的。我需要的最大解释是 while 循环的前两行。

(因为它是用 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
4

1 回答 1

12

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 再次被选中的可能性相同。

于 2009-10-14T13:35:48.540 回答