错误而洗牌在Java中
数组这是我迄今为止错误而洗牌在Java中
int[] question = new int[25];
for (int i = 0; i < question.length; i++){
question[i] = i+1;
}
Random rand = new Random();
int max = question.length-1, min = 1;
for(int i = 0; i < question.length; i++){
int idx = rand.nextInt((max - min) + 1) + min;
randg[i] = idx;
question[i] ^= question[idx];
question[idx] ^= question[i];
question[i] ^= question[idx];
if(question[i] == 0){
System.out.println("Something went wrong!" + i + " " + idx);
}
}
所以,问题似乎是当兰特值(IDX)等于我,为交换......它只是用0替换该值。
如何解决该问题?
我知道最快的修复方法;使用Integer[]
,Arrays.asList(T...)
和Collections.shuffle(List)
像
Integer[] question = new Integer[25];
for (int i = 0; i < question.length; i++) {
question[i] = i + 1;
}
System.out.println(Arrays.toString(question));
Collections.shuffle(Arrays.asList(question));
System.out.println(Arrays.toString(question));
,或者用代码,你可以添加
for(int i = 0; i < question.length; i++){
int idx = rand.nextInt((max - min) + 1) + min;
if (idx == i) {
i--;
continue;
}
我需要的方法返回一个'int []' – 2014-12-01 20:43:11
@Arian你可以将它复制到一个'int []' – 2014-12-01 20:44:02
但是这并不回答他为什么得到一个0. – AlexWien 2014-12-01 21:05:12
不建议将您正在使用的XOR交换,它可以零出位, 你的时候通过相同的变量两次,所以交换(a,a)可能会提供0: 更多信息请参阅:https://softwareengineering.stackexchange.com/questions/182037/is-this-xor-value-swap-algorithm-still-in-use-or-useful
你没有得到XOR Swap,它既不聪明也不fa韦伯斯特。 这是汇编langugae保存一个变量的技巧。
的推荐方法来交换:
在阵列交换两个值的[]索引i和j:A [1]和a [j]的:
int help = a[i];
a[i] = a[j];
a[j] = help;
OP是使用xor swap算法,它不需要一个临时的。 – 2014-12-01 20:47:13
@ElliottFrisch如果使用相同的参数,XOR交换可能会将位清零(http://programmers.stackexchange.com/questions/182037/is-this-xor-value-swap-algorithm-still-in-use-or-有用 – AlexWien 2014-12-01 20:58:39
如果无法到告诉错误的影响是什么,然后很难提供帮助。 – AlexWien 2014-12-01 20:40:05
我知道问题是什么......我只是不知道如何解决它。 – 2014-12-01 20:40:23
问题是,它交换的idx值等于i值。它将该值设置为零。 – 2014-12-01 20:41:08