0

私の Android アプリでは、指定された範囲から 2 つのランダムな整数を選択する必要があります。以下のコードは機能しますが、実際にはランダムな整数を選択するのではなく、整数をシャッフルしています。そして、私を悩ませているのはrandomNum2= (int)it.next();、コード内のビットのために、最大 int を実際の最大値よりも 1 小さい値として指定する必要があることです。正しい数値 (現在は 127) を最大値java.util.NoSuchElementExceptionとして設定すると、次の反復として 128 を探しているため、エラーが発生します。使用する前にrand = new Random(); randomNum1 = rand.nextInt(max - min + 1) + min; randomNum2 = rand.nextInt(max - min + 1) + min;しかし、2 つのランダムな int が同じになる可能性があるという問題があり、それらが一意である必要があります。最小/最大整数範囲から2つの乱数を取得するためのより良い方法を誰かが提案できますか? これが私のコードです:

    int min = 1;
int max = 126;
int randomNum1;
int randomNum2;
List<Integer> choicesL;

public void randomTwo() {
    choicesL = new LinkedList<Integer>();
    for (int i = min; i <= max; i++) {
        choicesL.add(i);
    }
    Collections.shuffle(choicesL);
    Iterator<Integer> it = choicesL.iterator();
    while (it.hasNext())
    {
        randomNum1= (int)it.next();
        randomNum2= (int)it.next();

    }

}
4

2 に答える 2

1

古いコードを使用できますが、ループ while を使用します。

rand = new Random(); 
randomNum1 = rand.nextInt(max - min + 1) + min;
randomNum2 = rand.nextInt(max - min + 1) + min;

while (randomNum2==randomNum1){
    randomNum2 = rand.nextInt(max - min + 1) + min;
}

編集

乱数を探す方法はたくさんあります。あなたがこれを知っているかどうかはわかりませんが、この下には多くの統計的研究があります. 乱数を計算するための高速な方法が必要な場合、これは素晴らしいことです。しかし、長い時間が経つと、ユーザーは乱数の分布がどのようになっているのかを知ることができることを知っておく必要があります. コードを改善したい場合は、次を確認してください。

http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform

http://en.wikipedia.org/wiki/Ziggurat_algorithm

そしてもちろん、ネット上にはもっと多くの理論があると思います

于 2012-12-12T16:24:17.063 に答える
0

a を使用してSet、セットのサイズが 2 になるまで要素を挿入し続ける ことができます。
(範囲のサイズと比較して) 要素の数が少ない場合、これはリストの作成 + シャッフルよりもはるかに効率的です。

int max = 126;
int min = 1;
int size = 2;
Set<Integer> set = new HashSet<Integer>();
Random r = new Random();
while (set.size() != size) {
    set.add(r.nextInt(max - min + 1) + min);
}
System.out.println(set);

注:これは、必要なすべてのサイズで機能する一般的な回答です(もちろんsize <= max - min

于 2012-12-12T16:21:03.877 に答える