2つの数の間にある乱数を作成する方法を理解しています。
1 + (int)(Math.random() * ((10 - 1) + 1))
また
min + (int)(Math.random() * ((max - min) + 1))
しかし、複数の範囲に分類される乱数を生成するにはどうすればよいですか?
例:数は1から10の間または50から60の間である可能性があります
私はあなたが好きなだけ多くの範囲でそれをすることができるように、このようなもので行きます:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class RandomInRanges
{
private final List<Integer> range = new ArrayList<>();
RandomInRanges(int min, int max)
{
this.addRange(min, max);
}
final void addRange(int min, int max)
{
for(int i = min; i <= max; i++)
{
this.range.add(i);
}
}
int getRandom()
{
return this.range.get(new Random().nextInt(this.range.size()));
}
public static void main(String[] args)
{
RandomInRanges rir = new RandomInRanges(1, 10);
rir.addRange(50, 60);
System.out.println(rir.getRandom());
}
}
最初に1から20までの整数を生成します。次に、値が10を超える場合は、2番目の間隔にマップします。
Random random = new Random();
for (int i=0;i<100;i++) {
int r = 1 + random.nextInt(60-50+10-1);
if (r>10) r+=(50-10);
System.out.println(r);
}
まず、各範囲にいくつの数字があるかを知る必要があります。(連続範囲からの実数値ではなく、離散範囲から整数を選択していると仮定します。)この例では、最初の範囲に10個の整数があり、2番目の範囲に11個の整数があります。つまり、10/21回は最初の範囲から選択し、11/21回は2番目の範囲から選択する必要があります。擬似コードで
x = random(1,21)
if x in 1..10
return random(1,10)
else
return random(50,60)
リストがわかっていれば、このようなものを使用できると思います。
public class Test
{
public static void main(String[] args)
{
int a;
for(int i=0;i<10;i++)
{
a=(int) (Math.random()*((10-0)+(60-50)));
if(a<=10)
{
}
else if(a>(60-50))
{
a=a+50;
}
System.out.println(a);
}
}
}
次のアプローチはどうですか。範囲をランダムに選択し、その範囲を使用して乱数を生成します。そのため、範囲をリストまたは配列に配置する必要があります。
public class RandomRangeGenerator {
class Range {
public int min, max;
public Range(int min, int max) { this.min = min; this.max = max; }
}
@Test
public void generate() {
List<Range> ranges = new ArrayList<>();
ranges.add(new Range(1, 10));
ranges.add(new Range(50, 60));
List<Integer> randomNumbers = generateRandomNumbers(ranges, 10);
System.out.println(randomNumbers.toString());
for(Integer i : randomNumbers) {
Assert.assertTrue((i >= 1 && i <= 10) || (i >= 50 && i <= 60));
}
}
private List<Integer> generateRandomNumbers(List<Range> ranges, int numberOfNumbers) {
List<Integer> randomNumbers = new ArrayList<>(numberOfNumbers+1);
while(numberOfNumbers-- > 0) {
Range range = ranges.get(new Random().nextInt(ranges.size()));
randomNumbers.add(range.min + (int)(Math.random() * ((range.max - range.min) + 1)));
}
return randomNumbers;
}
}
2つの範囲の間の数値を生成するには、可能性の総数を合計します。1-10は10を与え、50-60はさらに11を与えるので、合計21になります。次に、1〜21の乱数を生成します。
int rn = (int)(1 + (Math.random() * 21));
乱数が1から10の間であれば、それは簡単です。あなたはあなたの番号を持っています。11〜21の場合は、何らかの作業を行う必要があります。まず、モジュラスを使用して、50〜60の数値のインデックスを取得できます。その範囲には11の可能な値があるため、乱数を11で変更し、50を追加します。
if (rn > 10) {
rn %= 11;
rn += 50;
}
System.out.println(rn);
これにより、1〜10〜50〜60の値が出力されます。