我正在尝试为纸牌游戏程序编写shuffle
方法。该方法的工作原理是将牌组分成两半,然后将纸牌与其他两半交错。问题是,该方法只是将数组保持原样。什么都没有被洗牌。
/**
* Apply a "perfect shuffle" to the argument.
* The perfect shuffle algorithm splits the deck in half, then interleaves
* the cards in one half with the cards in the other.
* @param values is an array of integers simulating cards to be shuffled.
*/
public static void perfectShuffle(int[] values) {
int[] shuffled = new int[values.length];
int k = 0;
for (int j = 0; j < (values.length + 1) / 2; j++){
shuffled[k] = values[j];
k += 2;
}
k = 1;
for (int j = (values.length + 1) / 2; j < values.length; j++){
shuffled[k] = values[j];
k += 2;
}
values = shuffled;
}
错误在哪里?
您未使用数组shuffled的元素重新填充原始数组values。
values = shuffled;
不会复制并重新分配值。假设values数组是一个全局变量,您应该手动执行此操作:
for(int i =0;i<shuffled.length();i++)
values[i] = shuffled[i];
由于Java passes everything by value,您需要返回shuffled
并将values
分配给名称错误的方法perfectShuffle()
的返回值:
public static int[] perfectShuffle(int[] values) {
int[] shuffled = new int[values.length];
int k = 0;
for (int j = 0; j < (values.length + 1) / 2; j++) {
shuffled[k] = values[j];
k += 2;
}
k = 1;
for (int j = (values.length + 1) / 2; j < values.length; j++) {
shuffled[k] = values[j];
k += 2;
}
return shuffled;
}
和
public static void main(String[] args) {
int[] values = { 1, 2, 3, 4, 5 };
int[] shuffled = perfectShuffle(values);
// ...
}