Java中的选择随机化的实现

时间:2019-02-22 01:24:17

标签: java shuffle

public static void selectionShuffle(int[] values) {
    Random rand = new Random();
    for(int i = values.length; i > 0; i--) {
         int r = rand.nextInt(i); 
         swap(values, r, i);
    }
//updated answer to include below method
public static void swap(int[]a, int i, int j){
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

我正在写纸牌游戏,需要对纸牌进行随机排序,当我运行上述代码时,我得到了ArrayOutOfBoundsException,编译器特别抱怨 values[i] = values[r] 的重新分配。明确地说,这是不是旨在用作选择排序,而是用于选择 shuffle 。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

您的开始条件必须为values.length-1,因为Java数组是0length-1

测试也应该是>=0,因为在您编写时,它只会下降到索引1

for(int i = values.length - 1; i >= 0; i--) {

或者如IłyaBursov所指出的,您可以在索引i-1进行比较,并在有条件时保留for循环条件。不确定像上面的示例一样,我总是这样做是最好的形式。

而且,您没有在改组。您将索引i的值设置为r的值,但是丢失了先前i的值。您需要一个临时变量来交换值。

tmp = values[i];
values[i] = values[r];
values[r] = tmp;

答案 1 :(得分:0)

或者,您可以尝试Collections.shuffle(),但是如果您必须首先使用包装器类Integer而不是原始类型int,它将更加方便。

整数[]版本

public static void selectionShuffle(Integer[] values) {
    Collections.shuffle(Arrays.asList(values));
}

int []版本:

public static void selectionShuffle(int[] values) {
     Integer[] boxedArr = Arrays.stream(values).boxed().toArray( Integer[]::new );
     Collections.shuffle(Arrays.asList(boxedArr));
     for(int i=0 ; i<values.length ; i++){
         values[i] = boxedArr[i];
     }
 }