在多个范围内生成随机数

7

我知道如何生成介于两个数字之间的随机数:

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

或者

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

但是如何生成落入多个范围的随机数呢?

例如:数字可以在1到10之间或者在50到60之间。

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());
    }
}

适用于请求范围内的数字,但对于数字过多的范围可能不太实用。 - Javier
这个很好用!虽然我不太清楚它是如何工作的。 - Karlo Delalic
1
基本上,它只是列出您提供的范围内的所有数字,并从该列表中选择一个随机数,因此它是来自任何范围的随机数。 - MrLore

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

首先,您需要知道每个范围内有多少个数字。(我假设您选择的是离散范围内的整数,而不是连续范围内的实数。)在您的示例中, 第一个范围内有10个整数,第二个范围内有11个整数。这意味着您应该以10/21的概率从第一个范围选择,以11/21的概率从第二个范围选择。伪代码如下:

x = random(1,21)
if x in 1..10
   return random(1,10)
else
   return random(50,60)

这些范围可以轻松地用变量替换。 并使用变量计算所有范围中数字的总数。 - Halfacht

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之间(包括1和10以及50和60)的值。


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);
       }
    }
}

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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接