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)
数组的索引从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)