为什么 Collections.shuffle() 算法比我的实现效果更好
Collections.shuffle()
向后遍历 a 的每个索引,然后将其与包含或之前的随机索引交换。我想知道为什么,所以我尝试做同样的事情,但与.Collection
Collection
以下是 Collections.shuffle() 代码的洗牌部分:
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
这是我的算法:
Random r = new Random();
for (int i = 0; i < a.size(); i++) {
int index = r.nextInt(a.size());
int temp = a.get(i);
a.set(i, a.get(index));
a.set(index, temp);
}
我发现,当我在同一个代码上运行两者一百万次时,它的分布比我的代码均匀得多。另外,在以下位置运行代码时:Collections.shuffle()
ArrayList
[0, 1, 2, 3, 4]
似乎以下排列始终最常发生:
[1, 0, 3, 4, 2]
[1, 2, 3, 4, 0]
[1, 2, 0, 4, 3]
[0, 2, 3, 4, 1]
[1, 2, 3, 0, 4]
有人可以解释一下为什么吗?