有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何随机化数组,使任何元素都不在其原始位置

我应该取一个整数数组,从0开始,一直到另一个叫做cards的int数组的长度-1(有一个用户输入的长度),然后将它完全随机化,这样就不会有数字出现在它的原始位置
我知道了如何生成第一个数组,但我完全不知道如何完全随机化数组,有人能帮忙吗? 到目前为止,我已经:

int size = cards.length;
int[] numberList = new int[size];
for (int i = 0; i < size; i++) {
    numberList[i] = i;
}

更新:

private int[] shuffleIndex() {
    int size = cards.length;
    int[] numberList = new int[size];
    for(int i = 0; i < size; i++) {
        numberList[i] = i;
    }
    randomizer(numberList);
    return numberList;
}
    
private int[] randomizer(int[] input) {
    
    int size = input.length;
    
    Random random = new Random();
    
    for (int i = size -1; i > 0; i--) {
        int j = random.nextInt(i + 1);
        int temp = input[i];
        input[i] = input[j];
        input[j] = temp;
    }
    
    for(int i = 0; i < size; i++) {
    
        if(input[i] == i) {
            randomizer(input);
        }
    }
    return input;
}

共 (1) 个答案

  1. # 1 楼答案

    像这样试试

    int size = cards.length;
    int[] numberList = new int[size];
    for (int i = 0; i < size; i++) {
        numberList[i] = i;
    }
    shuffle(numberList);
    System.out.println(Arrays.toString(numberList));
    

    如果数组包含int 1-12,则这是一个输出示例

    [7, 12, 1, 2, 8, 9, 6, 4, 11, 5, 10, 3]
    
    

    下面是它的工作原理

    • 首先将size设置为数组大小
    • 迭代直到size==1
    • 抓取数组中的最后一个元素
    • 生成一个随机位置exclusive of the value of size将其移动到
    • 将该元素与最后位置的元素交换
    • 减小大小以保留新的最后一个元素。对nextInt()的下一次调用将不会触及它,因为它已递减
    • 由于生成的随机数不包括要交换的位置,因此任何元素都不会占据其原始位置
    public static void shuffle(int[] arr) {
        Random r = new Random();
        int size = arr.length;
        while (size  > 1) {
            int item = r.nextInt(size);
            int t = arr[size];
            arr[size] = arr[item];
            arr[item] = t;
        }
    }