洗牌阵列的最佳算法

时间:2014-10-05 03:36:29

标签: algorithm random permutation shuffle

我有一个数组s = {' ACA',' BBC',' CKA',...};

我想要洗牌。所以我创建了一个列表A = {1,2,3,4 ..}并列出了B = {1,2,3,4,...}

然后,我洗了两个名单。 random.shuffle(A) random.shuffle(B)

最后,我将s [A [0]]与s [B [0]]交换,交换s [A [1]]与s [B [1]] .....

这个算法是否产生s的随机排列?它足够随机吗?假设random.shuffle产生足够随机的A和B排列。

2 个答案:

答案 0 :(得分:2)

Knut's shuffle是一种简单而有效的方法来重新排列数组。您不需要其他索引数组。他们使用有什么特殊原因吗?

答案 1 :(得分:2)

要将Fisher - Yates(Knuth)shuffle与索引数组一起使用,请初始化单个索引数组A,如

for (int i = 0; i < n; i++) A[i] = /* random integer in 0..i */;

然后进行交换,如

for (int i = 0; i < n; i++) swap(&s[A[i]], &s[i]);

您的算法不会生成统一的随机排列。当n = 2时,A和B的可能性为

A = {0, 1}; B = {0, 1};
A = {0, 1}; B = {1, 0};
A = {1, 0}; B = {0, 1};
A = {1, 0}; B = {1, 0};

这些都不会对起始排列产生任何影响;要么两个元素都与自己交换,要么重复两次相同的重要交换,撤消其效果。

相关问题