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 で例外を返します。if (not >=1)を追加randomset.add(0 + (int)(Math.random() * ((99 - 0) + 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)));
    }       
}

}

于 2013-01-19T21:36:51.303 に答える
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)));

よりクリーンなコードを書く必要があります。

私はあなたのために解決策を用意しました:乱数でリストを生成し、あなたの条件を尊重する関数:2つの連続した数字は同じではありません。

生成する要素の数を指定して、このメソッド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 に答える
0

使用する

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

ArrayListインデックスが bounds 内にない要素を参照することはできません[0, size() - 1]ArrayListvia を作成ArrayList()すると、 size のリストが作成され0ます。この配列に要素を追加するには、要素を追加するメソッドの 1 つを呼び出す必要があります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);

これを呼び出すと、連続する 2 つの要素が等しくない乱数の整数のリストが生成されます。

[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

入力パラメーターとループ変数に同じ変数を使用しないでください。

public void randomgenerator(int 長さ) {

for (int j = 0; j < 長さ; j ++) ...

残りのコードに従っているかどうかはわかりませんが、それが始まりです。

于 2013-01-19T21:41:29.417 に答える