15

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

4

6 回答 6

16
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))
于 2010-09-14T14:01:18.077 回答
5

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

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

于 2010-09-14T14:10:06.093 回答
4

最简单的方法可能是用 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).

于 2010-09-14T13:57:06.750 回答
2

这是两个版本,一个以 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 将始终具有指定的长度。

于 2010-09-14T15:21:10.483 回答
1

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

还要注意的一件事是它不是经过良好测试的代码。

于 2014-04-10T12:35:38.507 回答
0

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

于 2010-09-14T14:01:39.480 回答