7

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

1 + (int)(Math.random() * ((10 - 1) + 1))

或者

min + (int)(Math.random() * ((max - min) + 1))

但是我该如何去生成一个属于多个范围的随机数呢?

例如:数字可以介于 1 到 10 或 50 到 60 之间

4

6 回答 6

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());
    }
}
于 2013-03-23T19:40:42.890 回答
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);      
}
于 2013-03-23T19:40:38.493 回答
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)
于 2013-03-23T19:43:17.297 回答
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;
    }
}
于 2013-03-23T20:11:24.547 回答
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);
       }
    }
}
于 2013-03-23T20:03:29.890 回答
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(含)之间的值。

于 2021-02-13T19:00:54.390 回答