2014-12-01 86 views
1

数组这是我迄今为止错误而洗牌在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替换该值。

如何解决该问题?

+0

如果无法到告诉错误的影响是什么,然后很难提供帮助。 – AlexWien 2014-12-01 20:40:05

+0

我知道问题是什么......我只是不知道如何解决它。 – 2014-12-01 20:40:23

+0

问题是,它交换的idx值等于i值。它将该值设置为零。 – 2014-12-01 20:41:08

回答

3

我知道最快的修复方法;使用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; 
    } 
+0

我需要的方法返回一个'int []' – 2014-12-01 20:43:11

+3

@Arian你可以将它复制到一个'int []' – 2014-12-01 20:44:02

+0

但是这并不回答他为什么得到一个0. – AlexWien 2014-12-01 21:05:12

1

不建议将您正在使用的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; 
+1

OP是使用xor swap算法,它不需要一个临时的。 – 2014-12-01 20:47:13

+0

@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