如何创建随机整数数组生成器

时间:2013-01-19 21:33:00

标签: java android random arraylist

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

// 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:索引1无效,大小为1

5 个答案:

答案 0 :(得分:1)

因为最初的randomset为空,因此其大小为0并在索引1处返回异常。如果randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));(不是&gt; = 1),则添加j < 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)));
    }       
}

}

答案 1 :(得分:0)

使用

 for(j=0; j<randomset.size(); j++){

答案 2 :(得分:0)

您无法引用其索引不在边界ArrayList中的[0, size() - 1]元素。通过ArrayList创建ArrayList()会创建一个大小为0的列表。要向此数组添加元素,您必须调用添加元素的方法之一,例如add()。您的第一个电话是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]

答案 3 :(得分:0)

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

public void randomgenerator(int length) {

for(int j = 0; j&lt; length; j ++)...

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

答案 4 :(得分:0)

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

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

,这是什么? ((99 - 0)+ 1)),你可以白色100,它很容易,更具可读性

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

你应该写一个更干净的代码。

我已经为你准备了一个解决方案:一个生成带有随机数的List并且尊重你条件的函数:两个连续的数字不一样。

您必须使用要生成的元素数量调用此方法 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;
}