我正在编写一个用于生成4096个随机和唯一整数的1d和2d数组的程序。我坚持我的方法来确定是否已经使用了一个整数,如果有,则抛出它并得到一个新的整数。目前,我收到一个越界异常错误,我已经查找了如何删除oob,但我没有找到任何与我的程序有关的帮助。有人可以看看我的代码,让我知道需要改变什么才能使逻辑正常工作?谢谢!
2D数组:
Random random = new Random();
int[][] arrayone = new int[4097][1];
boolean[][] used = new boolean[4097][1];
for(int b = 0; b < arrayone.length; b++) {
for(int i = 0; i < arrayone[b].length; i++) {
for (int number = 0; number < used.length; number++) {
for (int x = 0; number <used[number].length; x++) {
number = random.nextInt(99999)+1;
if (!used[number][x]){
used[number][x] = true;
arrayone[b][i] = number;
}
else {
while(used[number][x]) {
number = (int)(Math.random() * 99999 + 1);
if (!used[number][x]) {
used[number][x] = true;
arrayone[b][i]=number;
break;
}
}
}
}
}
}
}
1D数组:
int[] arrayone = new int[4097];
boolean[] used = new boolean[4097];
for(int i = 0; i < arrayone.length; i++) {
int number = (int)(Math.random() * 99999 + 1);
if (!used[number]){
used[number] = true;
arrayone[i] = number;
}
else {
while(used[number]) {
number = (int)(Math.random() * 99999 + 1);
if (!used[number]) {
used[number] = true;
arrayone[i]=number;
break;
}
}
}
}
答案 0 :(得分:3)
最好的方法是使用Set<Integer>
存储您已生成的数字,以便轻松了解它们是否已经添加/生成,如下所示:
Random random = new Random();
int[][] arrayone = new int[4097][1];
// Create my set of already generated numbers
Set<Integer> existingNumbers = new HashSet<>();
for(int b = 0; b < arrayone.length; b++) {
for(int i = 0; i < arrayone[b].length; i++) {
// Loop as long as the generated number cannot be added into the Set
// indicating that it has already been added so already been generated
int number;
do {
number = random.nextInt(99999) + 1;
} while (!existingNumbers.add(number));
// Add the number in my array
arrayone[b][i] = number;
}
}
答案 1 :(得分:0)
因为您宣布:
boolean[] used = new boolean[4097];
但是试图访问:
int number = (int)(Math.random() * 99999 + 1);
if (!used[number])
这里number
可能大于4096.这就是你越界失误的原因。 2D阵列也是如此。
要解决此问题,请在声明时增加数组大小。