Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中洗牌数组时出错_Java_Swap_Shuffle_Xor - Fatal编程技术网

在Java中洗牌数组时出错

在Java中洗牌数组时出错,java,swap,shuffle,xor,Java,Swap,Shuffle,Xor,这就是我目前所拥有的 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.next

这就是我目前所拥有的

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等于i时,对于交换。。。它只是将该值替换为0


如何解决这个问题?

我知道的最快的解决方法;使用整数[]等

或者,您可以使用您的代码添加

for(int i = 0; i < question.length; i++){
  int idx = rand.nextInt((max - min) + 1) + min;
  if (idx == i) {
    i--; 
    continue;
  }

我所知道的最快的解决办法;使用整数[]等

或者,您可以使用您的代码添加

for(int i = 0; i < question.length; i++){
  int idx = rand.nextInt((max - min) + 1) + min;
  if (idx == i) {
    i--; 
    continue;
  }

不建议使用XOR交换,它可能会将位归零, 当您两次传递同一个变量时,swapa可能会传递0: 有关更多信息,请参阅:

通过异或交换,您将一无所获,它既不聪明,也不更快。 保存一个变量是汇编语言的一个技巧

建议的交换方式:

交换数组a[]中索引i和j处的两个值::a[i]和a[j]:

int help = a[i];
a[i] = a[j];
a[j] = help;

不建议使用XOR交换,它可能会将位归零, 当您两次传递同一个变量时,swapa可能会传递0: 有关更多信息,请参阅:

通过异或交换,您将一无所获,它既不聪明,也不更快。 保存一个变量是汇编语言的一个技巧

建议的交换方式:

交换数组a[]中索引i和j处的两个值::a[i]和a[j]:

int help = a[i];
a[i] = a[j];
a[j] = help;


如果你不能说出错误的影响是什么,那么很难帮助你。我知道问题是什么。。。我只是不知道如何修复它。问题是当它交换等于I值的idx值时。它将该值设置为零。为了进行交换,您需要一个帮助变量,因为您没有+没有异常,它最初将数组的值设置为1到25,但在无序排列之后,它会为某些值插入0,其中idx==i表示swapIf,您无法判断错误的影响,那就很难帮助了。我知道问题是什么。。。我只是不知道如何修复它。问题是当它交换等于I值的idx值时。它将该值设置为零。要进行交换,您需要一个帮助变量,因为您没有+无异常,它最初将数组的值设置为1到25,但在无序移动之后,它会为某些值插入0,其中,swapI的idx==i需要方法返回int[]@Arian,您可以将其复制到int[]但这并不能回答为什么他得到一个0。我需要这个方法返回一个int[]@Arian,你可以把它复制到int[]但这并不能回答为什么他得到一个0。OP使用的是一个不需要临时变量的异或交换算法。@ElliottFrisch xor交换可能会将位归零,如果使用相同的参数OP使用的是一个不需要临时变量的异或交换算法。@ElliottFrisch xor交换可能会将位归零,如果使用相同的参数