【发布时间】:2015-02-26 09:27:26
【问题描述】:
我有一个对象元素列表
SourceList ResultList (Expected)
Obj_A Obj_F
Obj_B Obj_C
Obj_C Obj_G
Obj_D Obj_B
Obj_E Obj_A
Obj_F Obj_B
Obj_G Obj_E
随机播放 SourceList 中的元素,这样,任何元素都不应出现在其原始索引处(在 SourceList 中)在结果列表中。
例如,在 SourceList 中,C 位于索引 2 处,因此它不能位于 ResultList 中的索引 2 处强>
到目前为止,我已经研究了Dearrangement Wiki,但算法给了我可能的安排,我只需要一个。
【问题讨论】:
-
我假设您排除了必须对仅包含一个元素的列表进行操作。
-
您可以通过简单地旋转数组来实现这一点(将每个元素的索引移动 1 并将最后一个元素放在前面)。您需要如何“洗牌”结果数组?
-
另请注意,通过统一随机洗牌(如fisher yates),您有
1/e的概率得到重新排列。这意味着你可以重复这个过程直到你得到一个,这将花费预期的 e~= 2.7 排列数,所以平均情况下需要O(n)才能得到一个去排列,并且保证没有偏见,所有去排列都是可以达到的。
标签: c# algorithm random permutation shuffle