【问题标题】:how can I generate a random number of any particular number of digits (say 5) in java?如何在java中生成任何特定位数(比如5)的随机数?
【发布时间】:2014-10-28 22:15:08
【问题描述】:

我想在 java 中生成任何特定数字的随机数(比如 5,即 10000 到 99999)。我该怎么做?

【问题讨论】:

    标签: java


    【解决方案1】:

    0,10^k - 10^(k-1) 范围内创建一个随机整数,并在您的示例中添加10^(k-1)。范围0,90000,加10000。

    使用Random.nextInt(int) 方法。

    类似:

    new Random().nextInt(90000) + 10000
    

    【讨论】:

    • 这不支持负范围。而是使用rand.nextInt(upper - lower) + lower;
    • @Upio 您正在回答“如何在特定范围内生成整数”的一般问题。这个答案旨在展示如何创建一个 k 位整数,这是 OP 所要求的。
    • 你是对的。我误解了他所说的任何数字的意思。 :)
    • 但如果是 9 位或更高位的数字,我该怎么办?整数/整数变量会溢出对吗?请帮助使其通用。
    • @sbanerjee 您还可以使用nextLong() % number 来获得一个长范围(0,数字)。如果您的数字大于多头,您将需要BigInteger。您可以创建多个长整数,直到填充 k-1 位数字(包括前导零),然后在 [1,9] 范围内生成一个数字,并使其成为最重要的数字。
    【解决方案2】:

    简单。

    1. 生成一个最大为89999的随机数
    2. 每个生成的数字加 10000。

    【讨论】:

      【解决方案3】:

      以下是处理负值和正值范围的方法。计算范围大小内的随机数,然后添加下限。例如。如果范围是 100-150,则计算一个介于 0 和 50 之间的数字并加上 100。这适用于正范围和负范围。

      import java.util.Random;
      
      public class ArbitraryRange {
      
           public static void main(String []args){
              int start = -10000;
              int end = -5000;
      
              Random rand = new Random();
              int r = rand.nextInt(end - start) + start;
      
              System.out.println(r);
           }
      }
      

      【讨论】:

        【解决方案4】:
        public int generateRandom() {
            Random r = new Random( System.currentTimeMillis() );
            return 10000 + r.nextInt(20000);
        }
        

        这是来自here

        或:

        for (int i = 0; i < 10; i++) {  
             System.out.println(Math.round(Math.random() * 89999) + 10000);  
        }
        

        【讨论】:

          【解决方案5】:

          以下应该有效:

          public int getRandomNumber(int digits)
          {
              assert digits > 0; //added because of comment
              BigInteger tenPower = new BigInteger("10");
              return new Random().nextInt((tenPower.pow(digits).subtract(tenPower.pow(digits-1))).intValue()) + tenPower.pow(digits-1).intValue();
          }
          

          输出:

          Digits: 1
            - Random nextInt Param: 9
            - Adding: 1
            Random number: 1
          Digits: 2
            - Random nextInt Param: 90
            - Adding: 10
            Random number: 66
          Digits: 3
            - Random nextInt Param: 900
            - Adding: 100
            Random number: 377
          Digits: 4
            - Random nextInt Param: 9000
            - Adding: 1000
            Random number: 1734
          Digits: 5
            - Random nextInt Param: 90000
            - Adding: 10000
            Random number: 96602
          

          所以它会创建这样的数字:

          1...9
          10...99
          100...999
          1000...9999
          10000...99999
          

          【讨论】:

          • 所以值得注意的是,对于 1 位数字,它不会生成 0。除此之外,它很酷。如果需要,您也可以将其更改为 long 或保留为 BigInteger
          • 你是认真的吗?如果我传递 10 或 -5 作为参数怎么办?
          • @user1516873 我不确定我能理解negative digit count 的含义,甚至是0 digits 的数字。如果您愿意,我可以添加一个断言以防止这种情况发生。正如我所说,如果您愿意,可以将其保留为 BigInteger,但如果您想处理大量数字。
          猜你喜欢
          • 1970-01-01
          • 2021-05-31
          • 1970-01-01
          • 1970-01-01
          • 2010-09-26
          相关资源
          最近更新 更多