您从这种随机打乱中得到什么分布?


73

著名的Fisher-Yates随机播放算法可用于随机排列长度为N的数组A:

For k = 1 to N
    Pick a random integer j from k to N
    Swap A[k] and A[j]

一遍又一遍地告诉我不要犯的一个常见错误是:

For k = 1 to N
    Pick a random integer j from 1 to N
    Swap A[k] and A[j]

也就是说,您不是从k到N中选择一个随机整数,而是从1到N中选择了一个随机整数。

如果您犯了这个错误怎么办?我知道结果排列不是均匀分布的,但是我不知道对结果分布有什么保证。特别是,是否有人对元素的最终位置上的概率分布有表达式?


1
您真的要基于1的索引吗?
Svante,

这听起来很熟悉。是在过去两个月内在SO上讨论过此问题,还是在SE。程序员上进行过讨论?
oosterwal

@ oosterwal-我大约三个星期前问了这个问题,但没有得到很好的答案,所以我在上面放了一个大赏金,以帮助激发人们对此的兴趣。希望有人能够启发我们所有人!
templatetypedef

我还没有答案,但是我注意到的一件事是,每张卡最有可能出现在刚开始的位置。同样,第一张纸牌最后一张纸牌都均匀分布-也就是说,第一张纸牌在任何位置上结束的可能性均等,每张纸牌在最后一张位置结束的可能性均等。任何正确的解决方案都必须具有这些特征。
BlueRaja-Danny Pflughoeft

1
@Svante:为什么不呢?的语言,从帕斯卡其通常用来描述算法,并包括Lua中,很多具有索引从1开始。IIRC,帕斯卡允许以任意数目的开始数组索引,但默认为1
PhiLho

Answers:


55

一种经验方法。

让我们在Mathematica中实现错误的算法:

p = 10; (* Range *)
s = {}
For[l = 1, l <= 30000, l++, (*Iterations*)
   a = Range[p];
   For[k = 1, k <= p, k++, 
     i = RandomInteger[{1, p}];
     temp = a[[k]];
     a[[k]] = a[[i]];
     a[[i]] = temp
   ];
   AppendTo[s, a];
]  

现在获取每个整数在每个位置的次数:

r = SortBy[#, #[[1]] &] & /@ Tally /@ Transpose[s]  

让我们在结果数组中占据三个位置,并绘制该位置上每个整数的频率分布:

对于位置1,频率分布为:

在此处输入图片说明

对于位置5(中)

在此处输入图片说明

对于位置10(最后):

在此处输入图片说明

在这里,您将所有位置的分布都绘制在一起:

在此处输入图片说明

在这里您可以更好地统计8个职位:

在此处输入图片说明

一些观察:

  • 对于所有位置,概率“ 1”相同(1 / n)。
  • 概率矩阵关于大反对角线对称
  • 因此,最后一个位置上任何数字的概率也是均匀的(1 / n)

您可以查看从同一点开始的所有线(第一个属性)和最后一条水平线(第三个属性)的起点,以可视化那些属性。

从下面的矩阵表示示例中可以看到第二个属性,其中行是位置,列是乘员数,颜色表示实验概率:

在此处输入图片说明

对于100x100矩阵:

在此处输入图片说明

编辑

只是为了好玩,我计算了第二个对角元素的精确公式(第一个是1 / n)。其余的工作都可以完成,但这是很多工作。

h[n_] := (n-1)/n^2 + (n-1)^(n-2) n^(-n)

验证值从n = 3到6({8/27,57/256,564/3125,7105/46656})

编辑

在@wnoise答案中计算一些一般的显式计算,我们可以获得更多信息。

用p [n]代替1 / n,因此计算不予评估,例如,我们得到n = 7的矩阵的第一部分(单击以查看大图):

在此处输入图片说明

在与其他n值的结果进行比较之后,让我们确定矩阵中一些已知的整数序列:

{{  1/n,    1/n      , ...},
 {... .., A007318, ....},
 {... .., ... ..., ..},
 ... ....,
 {A129687, ... ... ... ... ... ... ..},
 {A131084, A028326 ... ... ... ... ..},
 {A028326, A131084 , A129687 ... ....}}

您可以在精美的http://oeis.org/中找到这些序列(在某些情况下具有不同的符号)

解决一般问题比较困难,但我希望这是一个开始


29

您提到的“常见错误”是随机换位。Diaconis和Shahshahani在生成具有随机换位的随机排列中进行了详细的研究(1981年)。他们对停止时间和收敛性进行了完整的分析。如果您找不到该论文的链接,请给我发送电子邮件,我可以将其转发给您。这实际上是一本有趣的书(Persi Diaconis的大多数论文也是如此)。

如果数组有重复的条目,则问题会稍有不同。作为一个无耻的插件,我,Diaconis和Soundararajan在《Riffle Shuffling的经验法则》(2011)的附录B中解决了这个更普遍的问题。


1
1981年的论文是否真的解决了这种特殊情况?我认为问题在于状态正在查看形式为(1 a_1)(2 a_2)...(n a_n)的排列分布,其中每个a_i均从1..n中均匀选择。
mhum 2011年

1
@mhum:我相信你说的不对。尽管我无法立即获得1981年的论文,但“概率和统计数据中的组表示”中的相应结果涵盖了统一的随机换位,而不是涉及那些涉及固定元素的换位。(它们很好地概括为可以在任何共轭类别上均等地随机分组,但是我看不到如何使它们直接在这里应用。)
wnoise 2011年

1
不幸的是,这得到了自动悬赏,因为它并没有真正回答问题……
BlueRaja-Danny Pflughoeft

1
考虑到belisarius的评分较高(当之无愧),我不知道该怎么做。
PengOne 2011年

1
@Peng因为我在赏金开始之前就张贴了我的答案
belisarius博士,11年

15

比方说

  • a = 1/N
  • b = 1-a
  • B i(k)是i交换k第th个元素后的概率矩阵。即对“交换k之后在哪里i?”这个问题的答案。例如B 0(3)=(0 0 1 0 ... 0)和B 1(3)= (a 0 b 0 ... 0)。你想要的是B N每k个(k)。
  • K i是一个NxN矩阵,在第i列和第i行中为1,在其他所有位置为零,例如:

kappa_2

  • 是单位矩阵,但是与该元素X = Y = I归零。例如,对于i = 2:

I_2

  • 一个

Ai = bIi + aKi

然后,

B_n

但是由于B N(k = 1..N)构成单位矩阵,因此任何给定元素i最终将位于位置j的概率由矩阵的矩阵元素(i,j)给出:

解矩阵

例如,对于N = 4:

B_4

如图所示,N = 500(颜色级别为100 *概率):

B_500

对于所有N> 2,模式都是相同的:

  • 第k个元素最可能的结束位置是k-1
  • 至少可能的终止位置为kķ<N * LN(2) ,位置1否则

即使对于较大的Ns也很容易计算出分析结果,但是这些表达式过于“混乱”,无法在此处包含。
Eelvex 2011年

这似乎是正确的,但是..您是怎么想到的呢?这和wnoise的答案一样吗?(对不起,我恐怕我听不懂随机矩阵。)
BlueRaja-Danny Pflughoeft

1
@EElvex我想知道您是如何计算的。
迈克·贝利

13

我知道我以前看过这个问题...

为什么使用这种简单的随机播放算法会产生有偏差的结果?这是什么简单原因? ”答案中有很多不错的东西,尤其是Jeff Atwood博客在Coding Horror上的链接。

您可能已经猜到了,根据@belisarius的回答,确切的分布高度取决于要改组的元素数。这是阿特伍德(Atwood)的六元素甲板的地块:

在此处输入图片说明


感谢您提供的链接/图片,但所有这些可以确认的是您得到的东西不一致。不过,我更希望能找到一个关于实际分布的解析解决方案。
templatetypedef

1
支持共享Jeff Atwood链接,该链接还描述了一种推导分布的方法-中断的随机播放具有n ^ n个同样可能的随机数选择,映射到n!输出。我认为您不会获得分析解决方案;对于n的较小值,只是一个数字。
克里斯·纳什

9

多么可爱的问题!我希望我有一个完整的答案。

Fisher-Yates很好分析,因为一旦决定了第一个元素,它就不会管它了。有偏见的人可以在任何地方反复交换元素。

通过将动作描述为线性地作用于概率分布的随机转移矩阵,我们可以像处理马尔可夫链一样进行分析。多数元素不放置,对角线通常为(n-1)/ n。在传递k时,当他们不孤单时,会与元素k交换(如果是元素k,则交换为随机元素)。在行或列k中,这是1 /(n-1)。行k和列k中的元素也是1 /(n-1)。将这些矩阵相乘就很容易,因为k从1到n。

我们确实知道,最后一位的元素原本可能在任何地方,因为最后一次传递将最后一位与其他任何一位同样地交换。同样,第一个元素将同样有可能放置在任何地方。这种对称性是因为转置颠倒了矩阵乘法的顺序。实际上,矩阵在行i与列(n + 1-i)相同的意义上是对称的。除此之外,数字并没有显示出明显的规律。这些确切的解决方案确实与belisarius进行的仿真一致:在插槽i中,当j升至i时,得到j的概率降低,在i-1处达到最低值,然后在i处升至最高值,并且减小直到j达到n。

在Mathematica中,我用

 step[k_, n_] := Normal[SparseArray[{{k, i_} -> 1/n, 
                      {j_, k} -> 1/n, {i_, i_} -> (n - 1)/n} , {n, n}]]

(我在任何地方都没有找到文档,但是使用了第一个匹配规则。)可以使用以下公式计算最终的转换矩阵:

Fold[Dot, IdentityMatrix[n], Table[step[m, n], {m, s}]]

ListDensityPlot 是有用的可视化工具。

编辑(作者belisarius)

只是一个确认。以下代码给出与@Eelvex答案相同的矩阵:

step[k_, n_] := Normal[SparseArray[{{k, i_} -> (1/n), 
                      {j_, k} -> (1/n), {i_, i_} -> ((n - 1)/n)}, {n, n}]];
r[n_, s_] := Fold[Dot, IdentityMatrix[n], Table[step[m, n], {m, s}]];
Last@Table[r[4, i], {i, 1, 4}] // MatrixForm

1
听起来很有趣,但我没有弄清您的概率分布是如何变化的-在我看来,您描述的马尔可夫链中的每个状态都需要指定整个n个元素的顺序(即,n个元素的问题需要(n!)状态的马尔可夫链)。你是这个意思吗?同样不确定您的推理是最后一个元素是否同样有可能来自任何地方-这是正确的,因为在处理完第一个n-1个元素之后所有n个元素都是均匀随机分布的,我不认为这是案例(或者至少我想看看证明)。
j_random_hacker 2011年

状态是n个插槽。转换矩阵中的条目i,j是从插槽i到插槽j的机会。将转换矩阵转换为“元素i最终到达的位置”的分布只是在挑选第i行。“元素j的来源”的分布只是在选择列j。确实,这不提供排列的计数,而仅给出元素结束的位置。
wnoise 2011年

1
@j_random_hacker:最后一个操作将最后一个元素与任何概率相等的元素交换。无论在此之前的分布如何,都会从所有元素中随机选择最后一个元素。
wnoise 2011年

谢谢,做了一些代数后,我现在明白了你的最后一点。关于马尔可夫状态:您是说要跟踪特定元素的运动(=在每个槽中的概率)?(例如,假设第ith个元素最初是i。那么我们可以说列向量transpose([0,0,1,0,...,0])表示元素3位置的初始概率分布,并且将其乘以对应于第一次交换的转换矩阵,将得出此步骤之后元素3位置的概率分布...
j_random_hacker11年

1
啊好。我在写另一条评论时已经过了一半,但我想我现在在正确的页面上。基本上,对于任何元素i,混洗基本上是一致随机的iff,将n个转换矩阵与紧跟的列矢量相乘后得到的结果是列矢量,第i行中的1和其他位置的0等于[1 / n,1 / n,...,1 / n]。这等效于要求转换矩阵乘积中的每一列都等于该值,这等效于要求乘积矩阵中的每个单项都为1 / n。
j_random_hacker 2011年

3

Wikipedia上有关Fisher-Yates随机播放的页面上有描述和示例,说明了在这种情况下将发生的情况。


2
感谢您提供的链接,但是我问这个问题的部分原因是Wikipedia文章只是说您将不会获得统一的分布,而不是从数学上看起来不均匀的分布。也就是说,没有讨论特定元素最终出现在特定位置的可能性。
templatetypedef

@templatetypedef:有一个简单案例的数字(我相信是6或7个元素)。我知道这不是一个完全笼统的答案。
耶利米·威尔考克

3

您可以使用随机矩阵计算分布。令矩阵A(i,j)描述最初在位置i处牌面最终到达位置j的概率。然后,第k个交换项具有由Ak(i,j) = 1/Nifi == k或给出的矩阵Ak j == k(位置k的卡可以终止于任何位置,任何卡都可以以相同的概率终止于位置k),Ak(i,i) = (N - 1)/N对于所有i != k(所有其他卡将在相同位置保留)概率(N-1)/ N),所有其他元素为零。

然后通过矩阵的乘积给出完全混洗的结果 AN ... A1

我希望您正在寻找有关概率的代数描述;您可以通过扩展上述矩阵乘积来获得一个,但我想它会相当复杂!

更新:我刚刚在上面发现了wnoise的等效答案!哎呀...


3

我对此进行了进一步的研究,结果证明对该分布进行了详尽的研究。之所以感兴趣,是因为该“中断”算法已(或曾经)用于RSA芯片系统。

通过半随机换位进行混洗中,Elchanan Mossel,Yuval Peres和Alistair Sinclair研究了这种混洗以及更一般的混洗类别。该论文的结果似乎是需要log(n)打乱打乱才能获得接近随机的分布。

三种伪随机混战Aequationes Mathematicae混洗,22,1981,268-292),Ethan Bolker和David Robbins分析了这种混洗,并确定单次通过后与均匀性的总变化距离为1,表明它不是很均匀完全是随机的。他们也提供渐近分析。

最终,洛朗·萨洛夫·科斯特(Laurent Saloff-Coste)和杰西卡·祖尼加(Jessica Zuniga)在研究非均匀马尔可夫链时发现了一个不错的上限。


2

这个问题要求对提到的打乱进行交互式视觉矩阵图分析。这样的工具会在页面随机播放吗?-为什么随机比较器不好-Mike Bostock。

Bostock汇集了分析随机比较器的出色工具。在该页面的下拉菜单中,选择天真的交换(随机↦随机)以查看损坏的算法及其产生的模式。

他的页面内容丰富,因为它使人们可以看到逻辑变化对随机数据的直接影响。例如:

此矩阵图使用非均匀且非常有偏的随机播放,是通过简单的交换(我们从“ 1到N”中选取)生成的,其代码如下所示:

function shuffle(array) {
    var n = array.length, i = -1, j;
    while (++i < n) {
        j = Math.floor(Math.random() * n);
        t = array[j];
        array[j] = array[i];
        array[i] = t;
    }
}

有偏的洗牌

但是,如果我们实现了一个非偏斜混洗(从“ k到N”中选取),我们应该看到如下图:

在此处输入图片说明

分布是统一的,并且是由以下代码产生的:

function FisherYatesDurstenfeldKnuthshuffle( array ) {
    var pickIndex, arrayPosition = array.length;
    while( --arrayPosition ) {
        pickIndex = Math.floor( Math.random() * ( arrayPosition + 1 ) );
        array[ pickIndex ] = [ array[ arrayPosition ], array[ arrayPosition ] = array[ pickIndex ] ][ 0 ];
    }
}

如果您将在此处包含更多信息,而不是将其隐藏在链接后面,则将是一个更好的答案。
Teepeemm,2015年

我不同意。我认为没有必要尝试重复daoudcwnoiseEelvex尤其是belisarius已经给出的出色答复。此页面上的答复缺少的只是某种交互式模型。链接提供了它。
Mac

1

到目前为止,给出的出色答案都集中在分布上,但是您还问过“如果犯了这个错误会发生什么?” -这是我尚未看到的答案,因此,我将对此进行解释:

Knuth-Fisher-Yates随机算法从n个元素中选择1个,然后从n-1个剩余元素中选择1个,依此类推。

你可以用两个数组a1和a2你来自哪里,A1删除一个元素,并将其插入到A2实现它,但是算法不到位(这意味着,它只需要一个数组),作为解释这里(谷歌:“改组算法Fisher-Yates DataGenetics”)。

如果不删除元素,则可以再次随机选择它们,从而产生有偏的随机性。这正是您所描述的第二个示例所做的。第一个示例是Knuth-Fisher-Yates算法,它使用从k到N的游标变量,该变量记住已经采用了哪些元素,因此避免了多次选取元素。


您是否认为,您可以用更可谷歌的方式代替“这里”?

完成后,我添加了一个Google搜索提示-但是,“这里”已经是一个链接。
马特

这就是这里链接的问题:意图可能对作者是显而易见的,但对读者而言却不明显(在遵循之前)。就像指向一个风景要说的样子!更有问题的是,有时网页消失了,或者整个站点都被关闭了(希望以前已经存档了):那时候,这里的简单变得毫无意义。不过,感谢您考虑到我的建议。

@沃尔夫:好点,我以前没有考虑过。您是对的,如果内容移动,则谷歌搜索可能仍会有所帮助。谢谢您引起我的注意!
马特
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.