我尝试使用循环生成4个没有重复的随机数,但我得到ArrayIndexOutOfBoundsException
。有人可以解释一下原因吗?
// SECRET ANSWER
int secret[] = new int[4];
for (int i = 0; i < secret.length; i++) {
secret[i] = (int) (Math.random() * 6 + 1);
if (secret[i] == secret[i + 1] || secret[i] == secret[i + 2] || secret[i] == secret[i + 3]) {
secret[i] = (int) (Math.random() * 6 + 1);
}
if (secret[i + 1] == secret[i + 2] || secret[i + 1] == secret[i + 3]) {
secret[i] = (int) (Math.random() * 6 + 1);
}
if (secret[i + 2] == secret[i + 3]) {
secret[i] = (int) (Math.random() * 6 + 1);
}
}
答案 0 :(得分:0)
因此,想象一下当你在数组中的最后一个元素时的情况。 你试图得到I + 1,I + 2,I + 3个不存在的元素。您需要将限制更改为长度 - 3或执行类似的操作
答案 1 :(得分:0)
你提到数组大小4,你试图增加它,这就是为什么你得到那个例外。你只能在数组中存储固定大小的元素。它不会在运行时增加它的大小。要解决此问题,请使用集合框架。
答案 2 :(得分:0)
在for循环的第二次迭代中,i
为1
。 “或”链中的前两个条件为false,因此评估第三个条件,这会导致secret[i + 3]
被访问。 i + 3
为4
,但秘密只有0
到3
的索引。你的算法毫无意义。
这将生成一个由[1..6]
范围内的4个不同的随机数组成的数组:
Random rand = new Random();
int[] secret = rand.ints(1, 7).distinct().limit(4).toArray();
虽然,如果必须使用for
循环,则应使用嵌套的for
循环检查当前索引之前的所有元素,因为这是您需要检查的全部内容。您还应该使用while
循环来确保生成随机数,直到您获得尚未生成的随机数。
例如:
int[] secret = new int[4];
for (int i = 0; i < secret.length; i++) {
int n;
boolean distinct;
do {
distinct = true;
n = (int) (Math.random() * 6 + 1);
for (int j = 0; j < i; j++) {
if (secret[j] == n) {
distinct = false;
}
}
} while (!distinct);
secret[i] = n;
}