Java 在多个范围之间生成随机数

Java 在多个范围之间生成随机数,java,random,range,Java,Random,Range,我知道如何制作介于两个数字之间的随机数: 1 + (int)(Math.random() * ((10 - 1) + 1)) 或 但是我如何生成一个随机数,它可以分为多个范围呢 例如:数字可以在1到10之间,也可以在50到60之间。首先生成1到20之间的整数。然后,如果该值大于10,则映射到第二个间隔 Random random = new Random(); for (int i=0;i<100;i++) { int r = 1 + random.nextInt(60-50+

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

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

但是我如何生成一个随机数,它可以分为多个范围呢


例如:数字可以在1到10之间,也可以在50到60之间。首先生成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);      
}
Random Random=new Random();
对于(inti=0;i10)r+=(50-10);
系统输出println(r);
}

我会选择这样的方式,让您可以在任意范围内进行操作:

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());
    }
}
import java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
类随机数范围
{
私有最终列表范围=新的ArrayList();
随机范围(最小整数,最大整数)
{
此.addRange(最小值、最大值);
}
最终无效添加范围(最小整数、最大整数)
{

对于(int i=min;i首先,您需要知道每个范围中有多少个数字。(我假设您是从离散范围中选择整数,而不是从连续范围中选择实数。)在您的示例中, 第一个范围中有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);
       }
    }
}
公共类测试
{
公共静态void main(字符串[]args)
{
INTA;

对于(int i=0;i以下方法如何:随机选取一个范围使用该范围生成随机数,因此必须将范围放入某个列表或数组中

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;
    }
}
公共类随机范围生成器{
等级范围{
公共整数最小值,最大值;
公共范围(int-min,int-max){this.min=min;this.max=max;}
}
@试验
public void generate(){
列表范围=新的ArrayList();
增加(新范围(1,10));
增加(新范围(50,60));
列出随机数=生成器随机数(范围为10);
System.out.println(randomNumbers.toString());
对于(整数i:随机数){
Assert.assertTrue((i>=1&&i=50&&i0){
Range Range=ranges.get(new Random().nextInt(ranges.size());
add(range.min+(int)(Math.random()*((range.max-range.min)+1));
}
返回随机数;
}
}

要生成两个范围之间的数字,请将可能性总数相加。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之间的值。

对于请求的范围来说很好,但是对于数字太多的范围来说可能不切实际。这很好!虽然我对它的工作原理一无所知。@KarloDelalic基本上它只是列出您给定范围内的所有数字,然后选择一个随机值该列表中的数字,因此是任何范围中的随机数。这些范围很容易用变量替换。并使用变量计算所有范围中的数字总数。
if (rn > 10) {
    rn %= 11;
    rn += 50;
}

System.out.println(rn);