生成多个范围之间的随机数

我理解如何制作一个两个数字之间的随机数:

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 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,则映射到第二个间隔。

 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个整数,第二个范围内有11个整数。 这意味着10/21次,您应该从第一个范围中选择,并且从第二个范围中选择11/21次。 在伪代码中

 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 ranges = new ArrayList<>(); ranges.add(new Range(1, 10)); ranges.add(new Range(50, 60)); List 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 generateRandomNumbers(List ranges, int numberOfNumbers) { List 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; } }