2

我创建了一种方法,它生成随机数,条件是下一个随机数与数组中的前一个不匹配这是代码

// some code   

int k=0;

//some code....

randomgenerator(k); // method call

public void randomgenerator(int j)
{

    for(j=0; j<=99; j++){
        if(j >= 1){
            if (randomset.get(j) == randomset.get(j-1)){
                randomset.add(0 + ( j  ,  int)(Math.random() * ((99 - 0) + 1)));
            }
            else{
                randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));
            }
        }       
    }
}

我得到的错误是 java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1

4

5 回答 5

1

因为最初 randomset 是空的,因此它的大小为 0 并在索引 1 处返回异常。添加randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));if j < 1(not >=1) 的最佳方法。

正确代码:

public void randomgenerator(int j)
{
for(j=0; j<=99; j++){
    if(j >= 1){
        if (randomset.get(j) == randomset.get(j-1)){
            randomset.add(0 + ( j  ,  int)(Math.random() * ((99 - 0) + 1)));
        }
        else{
            randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));
        }
    }
    else {
           randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));
    }       
}

}

于 2013-01-19T21:36:51.303 回答
0

采用

 for(j=0; j<randomset.size(); j++){
于 2013-01-19T21:38:55.093 回答
0

您不能引用ArrayList其索引不在 bounds 中的元素[0, size() - 1]。创建ArrayListviaArrayList()会创建一个 size 列表0。要将元素添加到此数组,您必须调用添加元素的方法之一,例如add()。您的第一个电话是 to get(),但列表有大小0,所以甚至get(0)会导致IndexOutOfBoundsException.

做什么取决于列表的预期内容。在您的情况下,我建议编写一个辅助函数,该函数在不包括指定数字的范围内生成一个随机数。您可以在一个简单的循环中使用该函数来生成整个列表,将前一个元素传递给提到的辅助函数。

例子:

public static int randomInRange(int a, int b) {
    return (int)(Math.random() * (b - a + 1));
}

public static int randomInRangeExcluding(int a, int b, int excluding) {
    int result = (int)(Math.random() * (b - a));
    if (result == excluding) {
        result++;
    }
    return result;
}

public static List<Integer> generateRandomList(int size) {
    ArrayList<Integer> result = new ArrayList<Integer>();
    for (int j = 0; j <= size; j++) {
        if (j > 0) {
            result.add(randomInRangeExcluding(0, size - 1, result.get(j - 1)));
        } else {
            result.add(randomInRange(0, size - 1));
        }    
    }
    return result;
}

并使用以下方法获取值:

generateRandomList(100);

调用它会产生一个随机整数列表,其中没有两个连续元素相等:

[27, 34, 53, 92, 56, 93, 21, 22, 45, 95, 48, 25, 18, 26, 54, 1, 82, 26, 5, 62, 84, 23, 8, 84, 25, 0, 36, 37, 54, 95, 4, 26, 65, 53, 81, 16, 47, 56, 73, 46, 60, 50, 37, 89, 61, 84, 23, 79, 47, 87, 68, 49, 15, 17, 55, 71, 17, 55, 71, 51, 67, 33, 80, 47, 81, 24, 10, 41, 76, 60, 12, 17, 96, 43, 57, 55, 41, 56, 21, 85, 98, 40, 9, 39, 53, 28, 93, 70, 89, 80, 40, 41, 30, 81, 33, 53, 73, 28, 38, 87, 29]
于 2013-01-19T21:39:59.710 回答
0

不要使用与输入参数和循环变量相同的变量。

公共无效随机发生器(整数长度){

对于 (int j = 0; j < 长度; j ++) ...

我不确定我是否遵循其余的代码,但这是一个开始。

于 2013-01-19T21:41:29.417 回答
0

你的功能是什么?您收到一个名为j的参数,然后您重新分配了它?

randomset.get(j) == randomset.get(j-1) <- 在这一行你有一个java.lang.IndexOutOfBoundsException因为你从位置 1 调用值但是在你的列表中你只有一个值位置 0; 所以抛出一个错误

而且,这是什么?((99 - 0) + 1)) ,你可以白100,简单易读

顺便说一句,在这一行你有一个错误, randomset.add(0 + ( j , (int)(Math.random() * ((99 - 0) + 1)));

您应该编写更简洁的代码。

我为您准备了一个解决方案:一个生成带有随机数的列表并尊重您的条件的函数:两个连续的数字不相同。

您必须使用要生成的元素数调用此方法generateRandomList

public static final Integer MAX_RANDOM_NUMBER = 100;


public static List<Integer> generateRandomList(int randomNumbers) {
    return generateRandomList(randomNumbers, -1);
}

private static List<Integer> generateRandomList(final int randomNumbers, final int previousNumber) {
    if (randomNumbers == 1) {
        return new ArrayList<Integer>() {
            {
                add(getNextNumber(previousNumber));
            }

        };
    } else {

        return new ArrayList<Integer>() {
            {
                int value = getNextNumber(previousNumber);
                add(value);
                addAll(generateRandomList(randomNumbers - 1, value));
            }

        };
    }
}

private static int getNextNumber(int previousNumber) {
    boolean generateNewValue = true;
    int currentValue = 0;
    while (generateNewValue) {
        currentValue = (int) (Math.random() * MAX_RANDOM_NUMBER);
        generateNewValue = currentValue == previousNumber;
    }
    return currentValue;
}
于 2013-01-19T22:15:20.117 回答