【问题标题】:How to randomize an array such that no element is in its original position如何随机化一个数组,使得没有元素位于其原始位置
【发布时间】:2021-12-30 14:39:46
【问题描述】:

我应该采用一个整数数组,从 0 开始,一直到其他一些称为卡的 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;
}

【问题讨论】:

标签: java arrays random


【解决方案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));

如果数组包含整数 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2012-04-21
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多