matlab - 这个 MATLAB 代码是如何工作的? (概率和随机序列)

标签 matlab random probability shuffle

我在 a comment 中看到了这段代码对于文章“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

最佳答案

概率 向量表示选择数字 1 到 6 的可能性的相对权重。一开始,他们都有平等的机会被选中。我将遍历 while 循环的每一行来解释它的作用:

  • while 循环中的第一行根据 probabilities 向量创建一个累积概率。 CUMSUM函数用于返回沿向量长度的累积和,并将其除以向量的总和(使用 SUM 函数找到)。在第一次通过循环时,cumprob 将具有以下值:

    0.1667    0.3333    0.5000    0.6667    0.8333    1.0000
    

    请注意,这些创建了一个从 0 到 1 的随机数可以落入的“箱子”。一个数字落入给定箱子的概率等于该箱子的宽度,因此 6 分之 1 (0.1667 ) 随机抽取的数字落入第一个 bin(从 0 到 0.1667)或第二个 bin(从 0.1667 到 0.3333)等的机会。

  • while 循环中的第二行选择一个随机数(使用 RAND 函数)并找到 cumprob 中大于该值的第一个元素的索引(使用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 的一个元素中减去的数量等于添加到上一行中所有元素的总量,导致总和的净变化为零概率向量。这使概率中的值保持有界,这样它们就不会不断增长。

  • while 循环末尾的 if 语句只是为了确保 probabilities 中的所有数字都是正数。如果向量的最小值(使用 MIN 函数找到)小于零,则从向量的每个元素中减去该值。这将确保 cumprob 向量的值始终介于 0 和 1 之间。

如果将 while true 语句替换为 for i = 1:6,则显示probabilities 向量和roll code> value 在每次迭代结束时运行代码几次,您可以看到代码是如何完成它的工作的。这是一组这样的 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 再次被选中的可能性相同。

关于matlab - 这个 MATLAB 代码是如何工作的? (概率和随机序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1566150/

相关文章:

Matlab:从矩阵中删除对角线并进行改革

python - Pandas 数据框中的随机行选择

范围内的 Javascript 随机数生成器,低于和高于给定范围

python - 为什么 Power BI 和 Python 使用 Seaborn 显示不同的分布?

java - 所有可能的对

string - 如何查找所有不包含子串回文的字符串

matlab - 如何确定 LDPC 生成器矩阵形成奇偶校验矩阵 (802.16e)

android - 在Android中将WAV文件转换为矢量

arrays - 根据一列创建子矩阵组

python - 从列表中随机化字符串,并对字符串的开头进行约束