【问题标题】:Generate a random integer with a specified number of digits Java [duplicate]生成具有指定位数Java的随机整数[重复]
【发布时间】:2016-05-13 18:07:50
【问题描述】:

我今天遇到了这个问题,我确信有一个我没有想到的优雅解决方案。

假设我想在 Java 中生成一个具有指定位数的随机整数(或长整数),其中该位数可以更改。

即将多个数字传入一个方法,并返回一个具有指定位数的随机数

Ex.) N = 3,生成100-999之间的随机数; N = 4,生成一个1000-9999之间的随机数

private long generateRandomNumber(int n){

/*Generate a random number with n number of digits*/

}

到目前为止我的尝试(这可行,但看起来很乱)

private long generateRandomNumber(int n){

    String randomNumString = "";

    Random r = new Random();

    //Generate the first digit from 1-9
    randomNumString += (r.nextInt(9) + 1);

    //Generate the remaining digits between 0-9
    for(int x = 1; x < n; x++){
        randomNumString += r.nextInt(9);
    }

    //Parse and return
    return Long.parseLong(randomNumString);

}

还有比这更好/更有效的解决方案吗?

*在指定范围内生成随机数的解决方案有很多,我对在给定位数的情况下生成随机数的最佳方法以及使解决方案足够健壮以处理任意数量的数字更好奇位数。

我不想输入最小值和最大值,而只是需要的位数

【问题讨论】:

  • 我喜欢你的方法,因为它不受 LONG 长度的限制,除非你把它转换成 long。
  • @aetheria 更新以说明为什么它不是重复的
  • @aetheria 你能解释一下为什么这是重复的吗?这是一个与您引用的完全不同的问题

标签: java random


【解决方案1】:
private long generateRandomNumber(int n) {
    long min = (long) Math.pow(10, n - 1);
    return ThreadLocalRandom.current().nextLong(min, min * 10);
}

nextLong 产生介于下限(包括)和上限(不包括)之间的随机数,因此使用参数 (1_000, 10_000) 调用它会产生数字 1000 到 9999。 不幸的是,旧的Random 没有获得那些不错的新功能。但无论如何,基本上没有理由继续使用它。

【讨论】:

  • 啊。我错过了这种方法,尽管它使用了相同的边界检查思想:while (r &lt; origin || r &gt;= bound)
  • 我不知道 ThreadLocalRandom。您是否建议将其用于一般的随机数生成?
  • @TonyScialo 是的。 stackoverflow.com/questions/23396033/…(除非你需要安全随机)
【解决方案2】:
public static int randomInt(int digits) {
    int minimum = (int) Math.pow(10, digits - 1); // minimum value with 2 digits is 10 (10^1)
    int maximum = (int) Math.pow(10, digits) - 1; // maximum value with 2 digits is 99 (10^2 - 1)
    Random random = new Random();
    return minimum + random.nextInt((maximum - minimum) + 1);
}

【讨论】:

    【解决方案3】:

    您可以简单地忽略不在要求范围内的数字。这样,您修改后的伪随机数生成器可以保证它在给定范围内均匀地随机生成一个数字:

    public class RandomOfDigits {
        public static void main(String[] args) {
            int nd = Integer.parseInt(args[0]);
            int loIn = (int) Math.pow(10, nd-1);
            int hiEx = (int) Math.pow(10, nd);
            Random r = new Random();
            int x;
            do {
                x = r.nextInt(hiEx);
            } while (x < loIn);
            System.out.println(x);
        }
    }
    

    【讨论】:

    • int x = loIn + r.nextInt(hiEx - loIn) 会更好。
    • 为什么会这样?我尝试了一百万次迭代,我的 PRNG 似乎确实倾向于平均值。也许我应该尝试更多...
    【解决方案4】:

    这是我自然会写出这样一个方法的方式:

    private long generateRandomNumber(int n){
        double tenToN = Math.pow(10, n),
               tenToNMinus1 = Math.pow(10, n-1);
        long randNum = (long) (Math.random() * (tenToN - tenToNMinus1) + tenToNMinus1);
        return randNum;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多