【发布时间】:2017-11-23 16:03:34
【问题描述】:
我还是个初学者,所以请善待。我很难理解为什么 Fisher-Yates 算法会永久修改数组元素而 Collections 的 shuffle 方法不会。我怀疑一个原因是我可能实际上并没有正确理解 Fisher-Yates 算法的工作原理,但我将不胜感激。代码如下:
导入 java.util.*;
公共类 ArrayShuffle {
private static char[] letters = {'a','b','c','d','e','f','g'};
public static void main(String[] args) {
System.out.println("Collections' shuffle method:");
shuffleCollections(letters);
System.out.print(letters);
System.out.println();
System.out.println("Fisher-Yates method:");
shuffleFisherYates(letters);
System.out.print(letters);
}
public static void shuffleCollections(char[] abc) {
List letterList = new ArrayList();
for(int alph=0; alph<abc.length; alph++)
//convert char to ArrayList object
letterList.add(abc[alph]);
//shuffle
Collections.shuffle(letterList);
System.out.println(letterList);
}
public static void shuffleFisherYates(char[] abc) {
int size = abc.length;
Random random = new Random();
for(int alph=0; alph<abc.length; alph++) {
int randomIndex = alph + random.nextInt(size - alph);
char randomLetter = abc[randomIndex];
abc[randomIndex] = abc[alph];
abc[alph] = randomLetter;
}
for(int shuffled = 0; shuffled<abc.length; shuffled++)
System.out.print(abc[shuffled]+" ");
System.out.println();
}
}
【问题讨论】:
-
你试的时候输入输出是什么?
-
嗯,您只是将数组的元素复制到一个列表中,然后对该列表进行洗牌。为什么要修改数组?如果数组是对象数组,并且您使用了 Collections.shuffle(Arrays.asList(array)),那么数组将被打乱(因为 Arrays.asList 是原始数组的列表视图,而不是副本)。
标签: java arrays algorithm shuffle