生成一个非重复整数数组
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
的方法,但假设您不能使用 Arrays
、Collections
等功能,List
,Set
甚至可能是流,我们需要使用现有的数组。
由于您的可接受值范围很小,需要适应更小的范围,一个简单的解决方案可能是生成允许值的“主”列表,并随机 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]
我试图在 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
的方法,但假设您不能使用 Arrays
、Collections
等功能,List
,Set
甚至可能是流,我们需要使用现有的数组。
由于您的可接受值范围很小,需要适应更小的范围,一个简单的解决方案可能是生成允许值的“主”列表,并随机 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]