我有一个数组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排列。
答案 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};
这些都不会对起始排列产生任何影响;要么两个元素都与自己交换,要么重复两次相同的重要交换,撤消其效果。