如何证明随机播放算法的正确性?


24

我有两种方法可以按随机顺序生成项目列表,并想确定它们是否同样公平(公正)。

我使用的第一种方法是构造元素的整个列表,然后对其进行随机播放(例如Fisher-Yates随机播放)。第二种方法更多是一种迭代方法,该方法使列表在每次插入时都保持乱序。在伪代码中,插入函数为:

insert( list, item )
    list.append( item )
    swap( list.random_item, list.last_item )

我对展示这种特殊混洗的公平性感兴趣。使用此算法的优点是足够的,即使稍微不公平也可以。要决定,我需要一种评估其公平性的方法。

我的第一个想法是,我需要以这种方式计算可能的总排列与一组最终长度可能的总排列。但是,我对如何计算该算法产生的排列有些困惑。我也不能确定这是最好的还是最简单的方法。


您可以对算法的大量运行进行统计抽样,然后将其与期望值进行比较,或者对其进行某种随机性检验。
戴夫·克拉克

您要测试分布。它是均匀分布的还是倾斜的。但是,我怀疑您需要运行很多很多次。
戴夫·克拉克

我不清楚该怎么做。这不是我追求的内容的随机性,而是排序的随机性。哪种方法可以衡量订单的分布?
edA-qa mort-ora-y 2012年

啊,愚蠢的我,我可以使用固定的输入集并使用每个元素的最终位置来获得分布。尽管如此,实际上我还是更喜欢逻辑证明而不是模拟。
edA-qa mort-ora-y 2012年

@ edA-qamort-ora-y:您的愿望是我的命令。;)
拉斐尔

Answers:


22

首先,让我们做出两个可能显而易见但重要的假设:

  1. _.random_item 可以选择最后一个位置。
  2. _.random_item选择概率为每个位置。1n+1

为了证明算法的正确性,您需要一个类似于此处使用的归纳参数:

  • 对于单例列表,只有一种可能性,因此统一选择它。
  • 假设从所有排列中均匀选择了元素的列表,则表明均匀选择了通过您的技术获得的元素的列表。nn+1

从这里开始,证明是错误的。请参阅下面的正确证明;我将其保留在此处,因为错误和后续步骤(正确的步骤)都可能具有教育意义。

派生必须保留的局部(即逐元素)属性很有用,因为争论整个置换过程很痛苦。观察到,如果每个元素在每个位置的概率均等,即均匀选择一个排列,即

πPermnPr(L=π)=1n!i=1n j=1nPr(Li=j)=1n(1)

其中并且为了简化符号,我们假设将插入列表中。n=|L|{1,,n}

现在,让我们看看您的技术在插入第 st元素时的作用。我们必须考虑三种情况(在交换之后):n+1

  1. 列表中未交换的元素之一,即和i{1,,n}j{1,,n}
  2. 列表中的元素之一被交换,即和i=n+1j{1,,n}
  3. 新元素,即和i{1,,n+1}j=n+1

对于每种情况,我们计算元素在位置的概率;所有结果都必须是(由于而已足够)。令是前元素之一在旧列表中的任何位置(归纳假设)的概率,而的概率为(假设1、2)选择的任何职位。请注意,具有元素的列表的coice 和选择交换位置是独立的事件,因此联合事件的概率因子,例如ji1n+1(1)pn=1nnps=1n+1random_itemn

Pr(Li=j,i swapped)=Pr(Li=j)Pr(i swapped)=pnps

对于。现在进行计算。i,j{1,,n}

  1. 我们只考虑旧的元素。当且仅当该元素在上一次插入之前在位置并且未选择作为交换位置时,​​该元素在位置处 njii

    Pr(Li=j)=pn(1ps)=1nnn+1=1n+1

  2. 在这里,我们认为一个旧元素被交换到最后一个位置。元素可能在任何旧位置上,因此我们对在位置上的所有概率求和,然后选择作为交换位置,即jjii

    Pr(Ln+1=j)=i=1npnps=i=1n1n1n+1=1n+1

  3. ii

    Pr(Li=j)=ps=1n+1

事实证明,您的插入策略确实可以保持一致性。通过归纳的力量,证明您的算法创建了均匀分布的排列。

警告:如果插入的元素不是成对的,则此证明将失效。可区分的,因为那时第一个方程不再有效。但是您的算法仍然有效;每个重复的排列都是由相同数量的随机执行产生的。您可以通过标记重复项(即使它们可区分)来证明这一点,执行上述证明并去除标记(实际上);最后一步是将大小相等的排列组合折叠为相同的排列。


(1)

random_itemL(k){1,,k}

πPermn+1{1,,n+1}

π=(π(1),π(2),,π(i1),n+1,π(i+1),,π(n),π(i))

πPermni{1,,n+1}Pr(L(n)=π)=1n!random_itemi1n+1πi

Pr(L(n+1)=π)=Pr(L(n)=π)Pr(i swapped)=1(n+1)!

我们必须证明。通过归纳的力量,证明您的算法创建了均匀分布的排列。


  1. {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140

4
“观察到,如果每个元素在每个位置都有相同的概率,则统一选择排列”-这是不正确的。例如,四个元素{(1、2、3、4),(2、3、4、1),(3、4、1、2、3、4、1、2、3, )}满足您的约束条件,但显然不是所有排列的集合。不幸的是,您必须使用排列的全局属性,因为没有任何局部条件足以确定均匀性。
史蒂文·斯塔德尼基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.