为什么会出现Collections.shuffle()算法的工作比我的实现[复制]

问题描述 投票:16回答:2

Collections.shuffle()向后遍历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]

可能有人请解释为什么?

Collections.shuffle()经过一个Collection向后的每个索引,然后与包括或之前随机索引交换它。我想知道为什么,所以我试图做同样的事情,但交换...

java shuffle
2个回答
37
投票

Collections.Shuffle()执行Fisher-Yates随机播放


3
投票

这是费舍尔·耶茨的另一种解释。

© www.soinside.com 2019 - 2024. All rights reserved.