Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个MATLAB代码是如何工作的?(概率和随机序列)_Matlab_Random_Probability_Shuffle - Fatal编程技术网

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

这个MATLAB代码是如何工作的?(概率和随机序列),matlab,random,probability,shuffle,Matlab,Random,Probability,Shuffle,我在文章“”中看到了此代码。我理解基本前提,但我不知道它是如何工作的。我需要的最大解释是while循环的前两行 (因为它是用MATLAB编写的,所以我只能猜测这段代码的功能。) 概率=[1]; 不羁=1; 虽然是真的 cumprob=cumsum(概率)。/sum(概率); 滚动=查找(cumprob>=兰德,1) 概率=概率+不确定性; 概率(滚动)=概率(滚动)-6*不随机性; 如果最小值(概率)具有以下形式: [x x x 1 x x] 其中x是大于1的某个值。此时,选择值4的概率为1/

我在文章“”中看到了此代码。我理解基本前提,但我不知道它是如何工作的。我需要的最大解释是while循环的前两行

(因为它是用MATLAB编写的,所以我只能猜测这段代码的功能。)

概率=[1]; 不羁=1; 虽然是真的 cumprob=cumsum(概率)。/sum(概率); 滚动=查找(cumprob>=兰德,1) 概率=概率+不确定性; 概率(滚动)=概率(滚动)-6*不随机性; 如果最小值(概率)<0 概率=概率-分钟(概率); 结束 结束
概率向量表示选择数字1到6的可能性的相对权重。一开始,他们都有平等的机会被选中。我将逐步介绍while循环的每一行,解释它的作用:

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

    0.1667    0.3333    0.5000    0.6667    0.8333    1.0000
    
    请注意,这些创建了0到1之间的随机数可以放入的“箱子”。一个数字落在一个给定箱子内的概率等于该箱子的宽度,因此随机抽取的数字落在第一个箱子(从0到0.1667)或第二个箱子(从0.1667到0.3333)的概率为六分之一(0.1667)

  • while循环中的第二行选择一个随机数(使用函数),并在
    cumprob
    中查找大于该值的第一个元素的索引(使用函数)。因此,
    roll
    值是一个从1到6的数字

  • while循环中的第三行通过向上移动所有相对权重,使所有数字的概率稍微接近相等,从而增加了“不随机性”。考虑下面的例子:<代码>概率< /代码>具有以下形式:

    [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循环中的第四行实质上与前一行相反,它显著降低了刚刚发生的任何数字的相对权重,从而降低了在后续循环中发生的可能性。由于前一行不断尝试将所有数字的发生概率恢复为相等,因此这种降低的发生概率将是短暂的

    请注意,从
    概率的一个元素中减去的金额等于添加到前一行中所有元素的总金额,从而导致
    概率的总和净变化为零。这将使
    概率中的值保持有界,这样它们就不会不断增长

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

如果将
while true
语句替换为
for i=1:6
,则在每次迭代结束时显示
概率
向量和
滚动
值,并将代码运行几次,您可以看到代码是如何运行的。这里有一组这样的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

请注意,
概率中的最终值是如何都相等的,这意味着在这一点上,数字1到6再次被选择的可能性都相等。

您能解释一下while循环中的前两行吗?我不懂Matlab,所以
cumsum
find
(特别是因为它似乎需要一个布尔输入)对我来说有一个未定义的目的。非常感谢,你给出了比我预期的好得多的解释。+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