Descripation:
Armstrong教授建议用下面的过程来产生一个均匀随机排列:
PERMUTE-BY-CYCLIC(A) n = A.length let B[1..n] be a new array offset = RANDOM(1, n) for i = 1 to n dest = i + offset if dest > n dest = dest - n B[dest] = A[i] return B请说明每个元素A[i]出现在B中任何特定位置的概率是1/n。然后通过说明排列结果证明不是均匀随机排列,表明Armstrong教授错了。
Answer:
(1)A[i]出现在B中的位置是由offset决定的,而且只要offset确定了,整个B就确定了;又因为offset=RANDOM(1,n),所以特定offset出现的概率相等,都为1/n,所以每个元素A[i]出现在B中任何特定位置的概率是1/n。
(2)因为offset只有n种可能,所以B也只有n种可能,但是A的所有均匀随机排列共有n!种情况,所以还有n!-n种情况没有出现,即排列结果不是均匀随机的。
博客探讨了Armstrong教授提出的PERMUTE-BY-CYCLIC算法,该算法用于生成随机排列。虽然每个元素出现在特定位置的概率为1/n,但因排列总数仅为n,而所有均匀随机排列的可能性为n!,因此得出结论:该算法并不产生均匀随机排列,Armstrong教授的建议存在错误。

被折叠的 条评论
为什么被折叠?



