0

int[] randomNumbers重複のない乱数の配列を生成する必要があります。これを行うには、 に入るすべての値を含む配列を作成しrandomNumbers、乱数ジェネレーターを使用してリストから 1 つを選択し、既に にあるかどうかを確認しrandomNumbers、そうでない場合は に入れrandomNumbersます。

(0 と max-1 ではなく、1 と max の間の数値が必要です)

Arrays.sort(int[]) を使用できるようにするには、リストをソートする必要があります。randomNumbersなので、 called と同じ値を持つ 3 番目の配列を使用し、sortedNumbers反復ごとに並べ替えます。

public int[] uniqueRandom(int max, int numRequired) {
    if (max < numRequired) {
        numRequired = max;
    }
    int[] randomNumbers = new int[numRequired];
    int[] sortedNumbers = new int[numRequired];
    int[] sequentialNumbers = new int[max];
    for (int i = 1; i < max; i++) {
        sequentialNumbers[i] = i;
            System.out.println(sequentialNumbers[i]);
    }

    int p = 0;
    while (p < numRequired) {
        int j = r.nextInt(max) + 1;
        System.out.println("J:" + j);
        if (Arrays.binarySearch(sortedNumbers, j) >= 0) {
            System.out.println("Number Found:" + Arrays.binarySearch(randomNumbers,  j));
        } else {
            randomNumbers[p] = j;
            sortedNumbers[p] = j;
            Arrays.sort(sortedNumbers);
            for (int i = 0; i < randomNumbers.length; i++) {
                System.out.println("rNum[" + i + "]:" + randomNumbers[i]);
            }
            System.out.println("\n");
            for (int i = 0; i < randomNumbers.length; i++) {
                System.out.println("sNum[" + i + "]:" + sortedNumbers[i]);
            }
            p++;
        }

    }

    return randomNumbers;
}

私の問題は、sortedNumbers値を上書きしている出力が得られることです。uniqueRandom(5, 5) の出力は次のとおりです。

J:2
rNum[0]:2
rNum[1]:0
rNum[2]:0
rNum[3]:0
rNum[4]:0

sNum[0]:0
sNum[1]:0
sNum[2]:0
sNum[3]:0
sNum[4]:2


J:2 // 2 already in the list, try again


J:2


J:4
rNum[0]:2
rNum[1]:4
rNum[2]:0
rNum[3]:0
rNum[4]:0

sNum[0]:0
sNum[1]:0
sNum[2]:0
sNum[3]:2
sNum[4]:4


J:5
rNum[0]:2
rNum[1]:4
rNum[2]:5
rNum[3]:0
rNum[4]:0

sNum[0]:0
sNum[1]:0
sNum[2]:2
sNum[3]:4
sNum[4]:5


J:2


J:3
rNum[0]:2
rNum[1]:4
rNum[2]:5
rNum[3]:3
rNum[4]:0

sNum[0]:0  // Should be:
sNum[1]:0  // 2
sNum[2]:2  // 3
sNum[3]:3  // 4
sNum[4]:5  // 5


J:4
rNum[0]:2
rNum[1]:4
rNum[2]:5
rNum[3]:3
rNum[4]:4

sNum[0]:0
sNum[1]:0
sNum[2]:2
sNum[3]:3
sNum[4]:4

それで、問題を見ることができます。私はJava 1.7を使用していますが、なぜこれを行っているのかわかりません!

4

5 に答える 5

2

同じインデックスを使用して、両方の配列に新しい番号を入れています。rNum配列は上から下に塗りつぶされていますが、並べ替えられた配列はそうではありません。並べ替えるたびに、新しい値が配列内で下に移動し、ゼロが常に上になります。ソートされた配列の最初の位置に常に新しい番号を配置することで、修正できると思います。

sortedNumbers[0] = j;
于 2012-10-25T12:53:56.787 に答える
2

あなたの問題を解決するために、ユニークな結果を保証するセットを使用します。

以下のスニペストは、必要な数の一意の整数を持つ配列を生成します。

Set<Integer> uniqueNumbers = new HashSet<Integer>();
Random r = new Random();
while(uniqueNumbers.size() < numRequired) {
    uniqueNumbers.add(r.nextInt(maxRandom) + 1);
} 
return uniqueNumbers.toArray(new Integer[0]);
于 2012-10-25T12:55:55.397 に答える
0

質問には答えませんが、ここに代替案がありO(n)、十分に提供されmaxていますが、大きくはありません。

public static void main(String[] args) {
    System.out.println(Arrays.toString(uniqueRandom(20, 10)));
}

public static int[] uniqueRandom(int max, int numRequired) {
    int[] possible = new int[max];
    int[] ret = new int[numRequired];
    for (int i = 0; i < max; i++)
        possible[i] = i + 1;
    Random r = new Random();
    int numLeft = max;
    for (int i = 0; i < numRequired; i++) {
        int idx = r.nextInt(numLeft);
        ret[i] = possible[idx];
        if (idx < --numLeft)
            possible[idx] = possible[numLeft];
    }
    return ret;
}

版画

[4, 10, 12, 19, 8, 3, 15, 1, 14, 7]

私が言おうとしているのは、おそらくもっと簡単にできるということです。

于 2012-10-25T13:11:23.647 に答える
0

コードにはいくつかの問題があります。

  • 新しい数値 j が配列にまだ存在しない場合にのみ p をインクリメントするため、最初に sortedArray を並べ替えるという事実と組み合わせると、実際には値が既存の値の上に配置されることがあります (これは、配列のために位置がシフトされます)。選別)

  • シーケンシャルナンバー配列の用途がわかりません...

動作するはずの例を次に示します。

private static Random r = new Random();

public static void main(String[] args) {
    System.out.println(Arrays.toString(uniqueRandom(10, 10)));
}

public static int[] uniqueRandom(int max, int numRequired) {
    if (max < numRequired) {
        numRequired = max;
    }
    int[] randomNumbers = new int[numRequired];
    int[] sortedNumbers = new int[numRequired];
    Arrays.sort(sortedNumbers);

    int p = 0;

    while (p < numRequired) {
        int j = r.nextInt(max) + 1;         
        if(Arrays.binarySearch(sortedNumbers, j)<0) {
            randomNumbers[p] = j;
            System.arraycopy(randomNumbers, 0, sortedNumbers, 0, randomNumbers.length);
            Arrays.sort(sortedNumbers);
            p++;
        }           
    }

    return randomNumbers;
}
于 2012-10-25T13:18:10.497 に答える
0

J=5を入力した場合

sortedNUM[] は

sNum[0]:0
sNum[1]:0
sNum[2]:2
sNum[3]:4
sNum[4]:5

次に J=3 (あなたの p=3) を入力すると

sortedNumbers[p] = j;

4 である sNUM[3] は 3 に置き換えられるため、ソート後は次のようになります。

sNum[0]:0  // Should be:
sNum[1]:0  // 2
sNum[2]:2  // 3
sNum[3]:3  // 4
sNum[4]:5  // 5

通知 4 はありません

配列を -1 または 0 に初期化し、次のように配列の先頭に変数を追加することをお勧めします

sortedNumbers[0]=j;

Arrays.sort(); の後 数字を追加するために、最初の位置は常に空になります

于 2012-10-25T12:59:19.543 に答える