繁体   English   中英

生成非重复整数数组

[英]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

很感谢任何形式的帮助!

因此,您的for-loop正在检查重复的字符,但是每次生成新值(在while-loop中)时,您都不会检查该值是否在j之前退出。

有许多可能的方法可以解决这个问题,我更喜欢使用Collections.shuffle的方法,但假设你不能使用ArraysCollectionsListSet甚至流等功能,我们需要使用什么我们有,数组。

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

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

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]

有很多更简单的方法可以做到这一点。 使用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 一旦它起作用,它还可以让您专注于代码的其他方面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM