【问题标题】:Generating a random number between multiple ranges在多个范围之间生成随机数
【发布时间】:2013-03-23 19:32:42
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java random range


    【解决方案1】:

    我会选择这样的东西,让您可以使用尽可能多的范围:

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

    【讨论】:

    • 适用于请求的范围,但对于数字过多的范围可能不切实际。
    • 这很好用!虽然我真的不知道它是如何工作的。
    • @KarloDelalic 基本上,它只是列出您给它的范围内的所有数字,然后从该列表中选择一个随机数,因此它是任何范围内的随机数。
    【解决方案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);      
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这些范围很容易被变量替换。并使用变量计算所有范围内的数字总数。
      【解决方案4】:

      如果列表已知,我认为您可以使用类似的东西。

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

      【讨论】:

        【解决方案5】:

        以下方法怎么样:随机选择一个范围并使用该范围来生成随机数,因为您必须将范围放在某个列表或数组中

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-08
            • 1970-01-01
            相关资源
            最近更新 更多