给出以下解释
问题:我们需要一种有效且无偏见的方式来生成随机数 成对的顶点以执行随机顶点交换。提出一个有效的 算法从{1,(n 2)无序对生成元素 。 。 。 ,n}统一随机。
解决方案:令人惊讶的是,均匀地生成随机结构 微妙的问题。请考虑以下过程来生成随机 无序对:i = random int(1,n-1); j = random int(i + 1,n);
很明显,这确实产生了无序对,因为i&lt;学家 此外,很明显所有(n 2)个无序对确实可以 生成,假设random int统一生成整数 两个论点之间。但他们是否统一?答案是不。什么是概率 生成对(1,2)?获得1的概率为1 /(n-1), 然后得到2的1 /(n-1)几率,得到p(1,2)= 1 /(n - 1)2。但是得到的概率是多少(n-1,n)?再一次,那里 获得第一个数字的可能性是1 / n,但现在只有一个 第二位候选人的可能选择!这对将出现n次 比第一次更频繁!问题是较少的对开始 大数字而不是小数字。我们可以解决这个问题 准确计算无序对如何从i开始(确切地说(n - i)) 并适当地偏向概率。那么第二个值就可以了 从i + 1到n随机均匀地选择。 但是,不要通过数学计算,让我们利用这个事实 随机生成n2个有序对很容易。选择 两个整数相互独立。忽略订购(即 ,将有序对置换为无序对(x,y),使x <0。 Y) 给出了每个无序对的2 / n ^ 2概率 不同的元素。如果我们碰巧生成一对(x,x),我们就会丢弃 它再试一次。我们将随机均匀地得到无序对 使用以下算法的恒定预期时间:
在上一段中“问题是较少的配对开始 大数字而不是小数字。“这不应该是更多的对而不是更少的对
在上面的段落中“我们可以通过精确计算无序对以i开头的方式来解决这个问题(确切地说(n - i))”这不应该是多少无序对而不是无序对
修改
谢谢
答案 0 :(得分:2)
在上面的段落&#34;问题是较少的对数从大数字开始而不是小数字。&#34;不应该是更多的配对而不是更少的配对
不,它少了。:
n - 1 pairs start with 1 (1 2; 1 3; ...; 1 n)
n - 2 pairs start with 2 (2 3; 2 4; ...; 2 n)
n - 3 pairs start with 3
...
在上面的段落&#34;我们可以通过精确计算无序对如何从i开始(完全(n-i))&#34;来解决这个问题。不应该有多少无序对而不是无序对
是的,有很多&#34;很多&#34;那里。
在上面的段落&#34;忽略排序(即,将有序对置换为无序对(x,y),使得x
有n*n
种生成对的可能性,其中顺序很重要(1 2
和2 1
是不同的对)。由于您继续忽略排序,1 2
和2 1
都是相同的,因此您有两个有利的案例。
这并不能解释您丢弃x x
对的事实。然后它会是2 / (n*(n - 1))
,因为如果你选择x
一次,那么第二个选择只有n - 1
种可能性。
答案 1 :(得分:0)
假设你的n项的索引是0 ..(n-1),random(n)
给出随机数≥0且&lt; 0。 n:
i = random(n)
j = random(n-1)
j = (i+j+1) % n
现在,i≠j的每一对(i,j)具有恰好1 /(n(n-1))的概率。显然,交换(i,j)与交换(j,i)具有相同的结果。
你也可以这样做:
i = random(n)
j = random(n)
忽略这可能导致(i,i)对的事实(交换它们将没有效果)。