【问题标题】:How do I generate a random n digit integer in Java using the BigInteger class?如何使用 BigInteger 类在 Java 中生成随机的 n 位整数?
【发布时间】:2011-04-12 04:36:05
【问题描述】:

我不确定如何使用 BigInteger 类在 Java 中生成随机的 n 位整数。

【问题讨论】:

  • 嗯 ...最好的方法是用完全随机的 32 位或 64 位数字构建它。不确定 API 是否允许这样做。
  • 嗯...我从来没有这样做过,但我相信 seanizer 提供了比我更好的解决方案。你应该接受他的回答。我想当你说“5000位数字”时,你的意思是第一个数字不是0,我的回答不符合这个。

标签: java biginteger digits


【解决方案1】:
private static Random rnd = new Random();

public static String getRandomNumber(int digCount) {
    StringBuilder sb = new StringBuilder(digCount);
    for(int i=0; i < digCount; i++)
        sb.append((char)('0' + rnd.nextInt(10)));
    return sb.toString();
}

然后你就可以使用它了:

new BigInteger(getRandomNumber(10000))

【讨论】:

  • @seanizer:如果我们想要在 1x..x - 9..9 范围内均匀分布,那么你是对的。我假设在整个范围内均匀分布。无论如何+1你的答案:)
  • 出于某种原因,我有时会得到 17 而不是 18 的长度
  • @JayshilDave:getRandomNumber(k) 将始终返回一串 k 位数字。但是,前导数字可能为 0,因此紧凑的数字表示可能更短(实际上 10% 的结果的长度应为 k-1 或更短)。
【解决方案2】:

根据文档,有一个构造函数可以在 java 6 中执行您想要的操作:BigInteger(int, java.util.Random)

为此,您只需添加随机选择的第 5000 位数字,即使用 rng 构造函数到 4999 位,通过单独的随机过程添加最后一个。实际上,由于您只想对较大值的性能进行采样,您可以生成位,并在大端添加一位,而不是从属于十进制表示法。

【讨论】:

  • 这给出了许多 bits 而不是 digits,如果 OP想要一个超过 5000 个数字的随机分布.. 基本上生成一个可能太大的随机值,然后重复直到出现一个合理的值。
  • @Jon:见编辑;如果 op 对他的问题的“大小”意味着什么很灵活,那么 5000 位(依此类推)可能与 5000 位一样好。另外,我的手机不适合回答问题。
  • 是的,我想要数字而不是位。我使用了你提到的构造函数,后来意识到它只是给出了一个介于 0 和 2^numbits - 1 之间的数字,而不是 5000 DIGIT 整数
  • @makaveli2178:如果您的目标是对大数字进行计时,那么这些数字的基数并不重要。
【解决方案3】:

最简单的方法可能是用 5000 个随机数字填充 char[] 数组,将其转换为字符串,然后调用 BigInteger(String) 构造函数。

如果这些步骤中的任何一个给您带来问题,请提供更多详细信息。

或者,您可以执行以下操作:

Random rng = new Random(); // But use one instance throughout your app
BigInteger current = BigInteger.ZERO;
for (int i = 0; i < 5000; i++) {
    BigInteger nextDigit = BigInteger.valueOf(rng.nextInt(10));
    current = current.multiply(BigInteger.TEN).add(nextDigit);
}

我怀疑这样效率会更低。

您可以通过使用rng.nextInt(1000000000) 一次生成九个随机数字来减少所需的步骤数。

【讨论】:

  • 请注意,这将为您提供 1 到 10^5000 之间的随机分布,因此由此产生的某些数字不会是 5000 位长。如果需要在所有 5000 个数字中均匀分布,则应将第一个数字制成 rng.nextInt(9)+1 选择的特殊情况。
  • @oksayt:是的,我几乎提到过……然后决定不那么挑剔;)
  • int i;字符[]数=新字符[5000];随机 R = 新随机();对于 (i = 0; i
  • 我采纳了您的建议,用 5000 个随机数字填充 char[] 数组,将其转换为字符串,然后调用 BigInteger(String) 构造函数(参见上面的代码)。但是,我收到以下错误:线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 处 java.lang.Integer 处的“[C”。 parseInt(Integer.java:449) 在 java.math.BigInteger.(BigInteger.java:316) 在 java.math.BigInteger.(BigInteger.java:451) 在 RandomNumber.main(RandomNumber.java :22)
  • @makaveli2178:您应该在值中添加“0”,而不是 1。否则,您的字符串中有 Unicode 值 1-10。
【解决方案4】:

这里有两个版本,一个以 Random 作为参数(以防你想重复使用它):

public static BigInteger getRandomNumber(final int digCount){
    return getRandomNumber(digCount, new Random());
}

public static BigInteger getRandomNumber(final int digCount, Random rnd){
    final char[] ch = new char[digCount];
    for(int i = 0; i < digCount; i++){
        ch[i] =
            (char) ('0' + (i == 0 ? rnd.nextInt(9) + 1 : rnd.nextInt(10)));
    }
    return new BigInteger(new String(ch));
}

生成的 BigInteger 将始终具有指定的长度。

【讨论】:

    【解决方案5】:

    如果 n 介于 1 到 12 之间,则以下方法会有所帮助

    private String getRandom(int length) {
        if (length < 1 && length > 12) {
            throw new IllegalArgumentException("Random number generator length should be between 1 to 12");
        }
        long nextLong = Math.abs(random.nextLong());
        return String.valueOf(nextLong).substring(0, length);
    }
    

    还有一点需要注意的是,它不是经过良好测试的代码。

    【讨论】:

      【解决方案6】:

      取一个包含 5000 位数字的字符串,然后将其转换为 BigInteger。

      【讨论】:

        猜你喜欢
        • 2020-10-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-08
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        相关资源
        最近更新 更多