【发布时间】:2015-04-06 14:30:19
【问题描述】:
Collections.shuffle() 向后遍历Collection 的每个索引,然后将其与随机索引交换它包括或之前。我想知道为什么,所以我尝试做同样的事情,但与Collection 中的 any 随机索引进行交换。
这是 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);
}
当我在同一个ArrayList 上运行一百万次时,我发现Collections.shuffle() 的分布比我的代码更均匀。另外,在运行我的代码时:
[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]
谁能解释一下原因?
【问题讨论】:
-
顺便说一下,您的帖子被故意编辑以删除诸如“非常感谢!”之类的称呼以适应问答格式,因此最好将其删除。原因是它使问题变得混乱。看到这个:meta.stackexchange.com/questions/2950/…