1

nAndroid コードで 0 ~ 31 の乱数を生成しようとしています。以下は私が使用しているコードです:

int max_range = 31;
SecureRandom secureRandom = new SecureRandom();
int[] digestCodeIndicesArr = new int[indices_length];
int i = 0, random_temp = 0;

while (i != indices_length-1) {
    random_temp = secureRandom.nextInt(max_range);
    if (!Arrays.asList(digestCodeIndicesArr).contains(random_temp)) {
        digestCodeIndicesArr[i] = random_temp;
        i++;
    }
}

indices_length必要な乱数の数です。通常は 6、7、または 9 です。しかし、生成された配列を印刷すると、通常は重複が見られます。誰かが私が犯している間違いを指摘できますか. ランダムな重複を除外するために、以下のコード行を追加しました。

if (!Arrays.asList(digestCodeIndicesArr).contains(random_temp))

前もって感謝します!

4

2 に答える 2

1

変更する必要があります:

int[] digestCodeIndicesArr = new int[indices_length];

に:

Integer[] digestCodeIndicesArr = new Integer[indices_length];

なぜなら、おそらくあなたが思っていたものではない(Arrays.asList(digestCodeIndicesArr)または私が推測する).List<int[]>List<int>List<Integer>

于 2016-01-27T19:46:57.690 に答える
1

Arrays.asList(digestCodeIndicesArr)List<Integer>with を生成しませんsize() == digestCodeIndicesArr.length。最初の (そして唯一の) 要素が配列であるwith を
生成します。 そのため、 が含まれることはないため、は常に true です。List<int[]>size() == 1
random_temp! contains()

常にリストを作成し、重複をチェックするために順次検索を実行すると、パフォーマンスが低下します。Set代わりに、配列と並行して維持する a を使用するか、最初LinkedHashSetに a を使用してから配列に変換します。

とにかく、これはあなたのコードが機能しなかった理由を説明しています。Tunaki が提供した複製リンクと私がコメントで提供した複製リンクは、あなたがやろうとしていたことを実際に行う方法を説明しています。

于 2016-01-27T19:28:53.310 に答える