4

最初の反復で、0..10 から乱数を作成したい

これが私がそれを実装した方法です-

 int generator= (int)(Math.random() * (10));

最初の繰り返しで、別の乱数を作成したいのですが、値の1つがありません。たとえば、数字4のない乱数が必要です.1,2,3,5,6,7,8,9,0のみ

乱数を生成するときに、数値 0..10 から値の 1 つを削除するにはどうすればよいですか?

4

7 に答える 7

5

第一の方法:-

Listすべての番号のを維持することもできます。次に、を使用Collections.shuffleしてリストをシャッフルし、最初の要素を取得します。そしてそれを削除します。

    List<Integer> list = new ArrayList<Integer>();

    list.add(1); 
    list.add(4);
    list.add(2);
    list.add(3);
    System.out.println("Original List: " + list);

    Collections.shuffle(list);

    System.out.println("Shuffled List: " + list);
    int number1 = list.remove(0);  // Remove the first value
    System.out.println("Number removed: " + number1);

    Collections.shuffle(list);

    System.out.println("Shuffled List: " + list);
    number1 = list.remove(0);
    System.out.println("Number removed: " + number1);

出力:-

Original List: [1, 4, 2, 3]
Shuffled List: [4, 3, 1, 2]
Number removed: 4
Shuffled List: [1, 3, 2]
Number removed: 1

2番目の方法:-

より良い方法は、リストのからから乱数を生成し、の値を取得して0削除することです。sizethat index

int size = list.size();
Random random = new Random();

for (int i = 0; i < size; i++) {    
    int index = random.nextInt(list.size());
    int number1 = list.remove(index);
    System.out.println(number1);
}

注:- 固定された番号のセットが生成されないようにする場合は、それらの番号をリストに含めることができます。次に、そのリストのすべての要素をから削除しますlist of numbers。次に、上記のアプローチのいずれかを使用します。

于 2012-10-30T18:54:30.723 に答える
1
int generator= (int)(Math.random() * (10));
if (generator >= 4) generator++;

これには、考えられる結果として数値10が含まれます。これが不要な場合は、10ではなく9を掛けてください。

于 2012-10-30T18:53:59.853 に答える
1

値をリストに保存し、そのリストから取得するランダムなインデックスを生成できます。

private Random random = new Random();
private ArrayList<Integer> values = new ArrayList<Integer>();

public static int nextInt() {
    if (values.size() > 0) {
        return values.remove(random.nextInt(values.size()));
    } else {
        throw new RuntimeException("no values possible");
    }
}
于 2012-10-30T18:54:10.290 に答える
1

Random.nextInt(10)==number再生成

public int generateExcept(int number) {
    Random random = new Random();

    int generated = 0;
    while ((generated = random.nextInt(11)) == number) {
    }
    return generated;
}

OPで引用されたように

最初の繰り返しで、別の乱数を作成したいのですが、値の1つがありません

私の理解が正しければ、これは反復操作ではなく単一操作です。

再生なし

public static int generateExcept(int number, int max) {
    Random random = new Random();
    int generated = 0;
    if ((generated = random.nextInt(max - 1)) == number) {
        generated++;
    }
    return generated;
}

max-11ずつインクリメントしたいので、ランダムは常に生成されます

于 2012-10-30T18:53:44.653 に答える
1

2 つの基本的な効率的なアプローチがあります。

1 - 有効な値 (4 を除く 0 から 10) の配列を生成し、ランダマイザーを使用してその配列のインデックスを選択します。以下に例を示します。

Random random = new Random();
int[] unwanted = {4};
int[] values = new int[10-unwanted.length];
for(int i=0; i<10-unwanted.length; i++){
  for(int curr : unwanted){
    if(i == curr) continue;
  }
  values[i] = i;
}
int result = values[random.nextInt(10-unwanted.length)];

2 -シモン・アンドレのアプローチに従ってください。

于 2012-10-30T19:01:32.350 に答える
0
int excluded[] = { 1,4,3};
Random r = new Random();
int generator;
do {
    generator= r.nextInt(10);
} while (! Arrays.asList(excluded).contains(generator) )
于 2012-10-30T18:51:38.853 に答える
0

あなたができること(おそらくこれを処理するよりクリーンな方法があります)は、2番目に生成された番号をチェックして、最初の番号と一致するかどうかを確認し、一致する場合は、ランダムな数値を実行させることです。再びジェネレーター。単純な if...else ループで処理する必要があります。

于 2012-10-30T18:52:04.777 に答える