2

乱数が1回だけ生成されるようにするにはどうすればよいですか?

例えば:

for(int i = 0; i<len; i++)
    {
        while (rands.contains(rand = r.nextInt(len-2)+1));
        rands.add(rand);
        System.out.print ("Rand ___ " + rand + "___");
    }

番号2がrandから生成された場合、それが再度生成されないようにするにはどうすればよいですか?

自分自身を十分に明確にしていない場合は、お詫び申し上げます。さらに情報が必要な場合はコメントしてください。

ありがとう。

4

5 に答える 5

1

ランダムAPIを使用する場合、これを実際に制限することはできません。すでに生成された番号のリストを保持し、まだ生成されていない場合はその番号を返す必要があるかもしれません。

于 2012-07-30T19:37:28.000 に答える
1

生成したすべての番号を保存し、新しい番号を確認する必要があります。HashSetパフォーマンスのために使用します。

HashSet<Integer> rands = new HashSet<Integer>();
for(int i = 0; i<3; i++)
{
   int rand;
   while (rands.contains(rand = r.nextInt(3)))
       ;
   rands.add(rand);
}
于 2012-07-30T19:39:52.370 に答える
0

私はあなたがランダムな順序で0から2までの数字のリストを作成したいと思っていると仮定しています(私が間違っているなら、私に知らせてください)

あなたが本当に欲しいのはそれらの番号のリストを作成することです

ArrayList<Integer> randomNums = ArrayList<Integer>() {{ add(0); add(1); add(2); }}

次に、それCollectionsをシャッフルするために使用します。

Collections.shuffle(randomNums)
于 2012-07-30T19:40:12.120 に答える
0

これにはシャッフルアルゴリズムを使用する必要があります。1から始めます。1から1000(任意のサイズ)までの整数の配列を作成します。アレイをよくシャッフルします。それらがなくなるまで、シャッフルされた配列からフェッチし続けます。1000を通過したら、アレイに1000-2000を再設定し、シャッフルして使用します。このプロセスを必要な回数繰り返します。

于 2012-07-30T19:44:07.763 に答える
0

ある範囲で繰り返されない乱数のストリームが必要な場合は、次のようにすることができます。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class RandomNumberStream {
    private Iterator<Integer> numbers;

    public RandomNumberStream(int range) {
        List<Integer> numbersList = new ArrayList<>(range);
        for(int i = 0; i < range; i++) {
            numbersList.add(i);
        }
        Collections.shuffle(numbersList);
        numbers = numbersList.iterator();
    }

    public int nextNumber() {
        if(!numbers.hasNext()) {
            throw new IllegalStateException("No more numbers...");  //you might want to handle this differently
        }
        return numbers.next();
    }

    public static void main(String[] args) {
        RandomNumberStream rand = new RandomNumberStream(5);

        for(int i = 0; i < 5; i++) {
            System.out.println(rand.nextNumber());
        }
    }
}
于 2012-07-30T19:46:37.450 に答える