数组/ n的随机元素均匀随机排列.可能在预期的O(n)时间内

0fn*_*fnt 3 algorithm probability

是否有可能统一地对n个大小的数组的元素进行混洗,即任何n的概率!在预期O(n)时间内发生的组合是相同的.怎么会这样?我必须将元素改组A为新数组B 当我尝试这样做时,我想到的第一件事就是i从1到n中选择一个随机数,看看是否A[i]已经被选中,如果是,那么重复一遍,否则放在A[i]第一个可用的位置B.然而,这个优惠券收集器问题已经预料到了O(n log n).有人可以建议O(n)预期的时间算法.

谢谢.

Mat*_*Mat 11

你应该看看Fisher-Yates shuffle.

来自文章:

正确实施,Fisher-Yates shuffle是公正的,因此每个排列都是同样可能的.该算法的现代版本也相当有效,只需要与被洗牌的项目数量成比例的时间,而不需要额外的存储空间.

所以它符合您的要求.它也非常容易实现.