[英]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
的方法,但假设你不能使用Arrays
、 Collections
、 List
、 Set
甚至流等功能,我们需要使用什么我们有,数组。
由于您有一小部分可接受的值需要适应更小的范围,一个简单的解决方案可能是生成允许值的“主”列表并从主列表中随机选择一个值,跟踪您已经已经选好了。
听起来比实际上更复杂,例如......
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.