最初の反復で、0..10 から乱数を作成したい
これが私がそれを実装した方法です-
int generator= (int)(Math.random() * (10));
最初の繰り返しで、別の乱数を作成したいのですが、値の1つがありません。たとえば、数字4のない乱数が必要です.1,2,3,5,6,7,8,9,0のみ
乱数を生成するときに、数値 0..10 から値の 1 つを削除するにはどうすればよいですか?
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
より良い方法は、リストのからから乱数を生成し、の値を取得して0
削除することです。size
that 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
。次に、上記のアプローチのいずれかを使用します。
int generator= (int)(Math.random() * (10));
if (generator >= 4) generator++;
これには、考えられる結果として数値10が含まれます。これが不要な場合は、10ではなく9を掛けてください。
値をリストに保存し、そのリストから取得するランダムなインデックスを生成できます。
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");
}
}
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-1
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 -シモン・アンドレのアプローチに従ってください。
int excluded[] = { 1,4,3};
Random r = new Random();
int generator;
do {
generator= r.nextInt(10);
} while (! Arrays.asList(excluded).contains(generator) )
あなたができること(おそらくこれを処理するよりクリーンな方法があります)は、2番目に生成された番号をチェックして、最初の番号と一致するかどうかを確認し、一致する場合は、ランダムな数値を実行させることです。再びジェネレーター。単純な if...else ループで処理する必要があります。