变量i减去1的目的是什么?是 - 1对于公平随机化真的是必要的吗?

Tho*_*hor 4 java random algorithm collections

我在Oracle文档中看到了这段代码.

该文件指出:"下面的洗牌方法,不像大多数天真的洗牌尝试,这是公平的(假设无偏见的随机性来源,所有排列都有相同的可能性发生)".

我的问题是交换方法中变量i减1的目的是什么?是 - 1对于公平随机化真的是必要的吗?

public static void shuffle(List<?> list, Random rnd) {
    for (int i = list.size(); i > 1; i--)
        swap(list, i - 1, rnd.nextInt(i));
}
Run Code Online (Sandbox Code Playgroud)

ind*_*v99 5

数组的索引从0到其大小减1.由于i从list.size()开始,比最后一个元素的索引多1,并且在索引2处结束,因此需要从i减去1.另一种选择是

 public static void shuffle(List<?> list, Random rnd) {
    for (int i = list.size() - 1; i > 0; i--)
        swap(list, i, rnd.nextInt(i+1));
}
Run Code Online (Sandbox Code Playgroud)

  • 那应该是:`swap(list,i,rnd.nextInt(i + 1));`否则你永远不会将一个条目交换到列表中的最后一个元素,这意味着它不是一个公平的shuffle函数. (2认同)