生成一个非重复整数数组

Generating an array of non-repeating integers

我试图在 Java 中生成一个包含 5 个非重复整数的数组,但是当我 运行 它时仍然有重复。到目前为止,这是我的代码:

public int[] generateCode(){
    code[0] = (int)Math.round(Math.random()*8+1); // initialize first number so it won't be compared against 
    for(int i=1; i<code.length; i++){
        code[i] = (int)Math.round(Math.random()*8)+1;
        for(int j=0; j<i; j++){
            while(code[i]==code[j]){
                code[i] = (int)Math.round(Math.random()*8)+1;
            }
        } // end inner for loop
        
    } // end outer for loop
    return code;
    
    
} // end generateCode method

非常感谢任何帮助!

有更简单的方法可以做到这一点。使用 Set<Integer> 就是一个。这是另一个。

List<Integer> list = new ArrayList<>(List.of(1,2,3,4,5,6,7,8));
Collections.shuffle(list);
System.out.println(list.subList(0,5));

打印类似

的东西
[4, 5, 8, 2, 1]

正如我所指出的,您可能不被允许使用或了解集合。但我建议您至少制作一个辅助方法来检查重复项以减少混乱。类似于以下内容:

public boolean contains(int[] arr, int n) {
    for (int v : arr) {
        if (v == n) {
          return true;
        }
    }
    return false;
}

然后你可以在添加它之前继续检查当前值是否为false。一旦成功,您还可以专注于代码的其他方面。

因此,您的 for-loop 正在检查重复字符,但每次您生成新值(在 while-loop 中)时,您都没有检查该值是否在 [= 之前​​退出15=].

您可以通过多种方式解决此问题,我更喜欢使用 Collections.shuffle 的方法,但假设您不能使用 ArraysCollections 等功能,ListSet 甚至可能是流,我们需要使用现有的数组。

由于您的可接受值范围很小,需要适应更小的范围,一个简单的解决方案可能是生成允许值的“主”列表,并随机 select 从主列表,跟踪您已经选择了哪些值。

听起来比实际更复杂,例如...

public int[] generateCode() {
    int[] masterValues = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int[] codes = new int[5];
    
    Random rnd = new Random();
    int index = 0;
    while (index < codes.length) {
        int lookupIndex = 0;
        do {
            lookupIndex = rnd.nextInt(masterValues.length);
        } while (masterValues[lookupIndex] == 0);
        codes[index] = masterValues[lookupIndex];
        masterValues[lookupIndex] = 0;
        index++;
    }
    return codes;
}

这将创建一个“主”值列表。然后它随机计算一个“查找”索引,检查主列表中的值是否为 0,如果不是,则将其分配给 codes 数组中的下一个索引并设置主列表中的值设置为 0,否则它会生成一个新的随机索引并重试。这一切都会重复,直到填满 codes 数组

所以做一些像...

System.out.println(Arrays.toString(generateCode()));
System.out.println(Arrays.toString(generateCode()));
System.out.println(Arrays.toString(generateCode()));
System.out.println(Arrays.toString(generateCode()));

可以打印(因为它是“随机的”)...

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