我理解如何制作两个数字之间的随机数:
1 + (int)(Math.random() * ((10 - 1) + 1))
或
Min + (int)(Math.random() * ((Max - Min) + 1))
但是如何生成一个属于多个范围的随机数呢?
例如:数字可以介于1到10之间或介于50到60之间
答案 0 :(得分:5)
我会选择这样的东西,让你可以在任意数量的范围内进行:
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 :(得分:2)
首先生成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);
}
答案 2 :(得分:2)
首先,您需要知道每个范围内有多少个数字。 (我假设您从离散范围中选择整数,而不是连续范围内的实数值。)在您的示例中, 第一个范围内有10个整数,第二个范围内有11个整数。这意味着10/21次,您应该从第一个范围中选择,而从第二个范围中选择11/21次。在伪代码中
x = random(1,21)
if x in 1..10
return random(1,10)
else
return random(50,60)
答案 3 :(得分:0)
如果列表已知,我认为你可以使用这样的东西。
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);
}
}
}
答案 4 :(得分:0)
以下方法如何:随机选择一个范围,使用该范围来生成随机数,因为您必须将范围放在某个列表或数组中
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;
}
}
答案 5 :(得分:0)
在两个范围之间生成数字将可能性的总数相加。 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 之间的值。