为什么这个代码生成4个不同的随机数抛出一个ArrayIndexOutOfBoundsException?

时间:2017-10-30 03:15:00

标签: java indexoutofboundsexception

我尝试使用循环生成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);
    }
}

3 个答案:

答案 0 :(得分:0)

因此,想象一下当你在数组中的最后一个元素时的情况。  你试图得到I + 1,I + 2,I + 3个不存在的元素。您需要将限制更改为长度 - 3或执行类似的操作

答案 1 :(得分:0)

你提到数组大小4,你试图增加它,这就是为什么你得到那个例外。你只能在数组中存储固定大小的元素。它不会在运行时增加它的大小。要解决此问题,请使用集合框架。

答案 2 :(得分:0)

在for循环的第二次迭代中,i1。 “或”链中的前两个条件为false,因此评估第三个条件,这会导致secret[i + 3]被访问。 i + 34,但秘密只有03的索引。你的算法毫无意义。

这将生成一个由[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;
}