4

是否可以让用户选择随机数的位数,特别是随机大整数?例如,如果用户希望它为 15 位长,则随机数生成器将仅生成 15 位长的大整数。

4

4 回答 4

5

您可以使用BigInteger指定二进制位数的构造函数:BigInteger(int numBits, Random rnd). 对于用户想要的每三个十进制数字,您需要大约十个二进制数字。例如,如果您需要 30 位随机数BigInt,请使用 100 个二进制位。

可以使用 截掉不需要的数字,remainder(10^30)循环执行,保证初始数字不为零,保证位数正确,像这样:

Random rnd = new Random(123);
BigInteger tenPow30 = new BigInteger("10").pow(30);
BigInteger min = new BigInteger("10").pow(29);
BigInteger r;
do {
        r = new BigInteger(100, rnd).remainder(tenPow30);
} while (r.compareTo(min) < 0);
System.out.println(r);

链接到演示

于 2012-09-15T18:30:00.703 回答
4

您始终可以随机生成数字的单个数字。这样对于 15 位数字,您可以随机生成 15 位数字,然后形成数字。

其他方式:

让我们改变问题以生成随机的 5 位数字。

Min = 10000
Max = 99999

现在生成一个介于0和之间的随机数,并将Max - Min其添加到.089999Min

Random = Min + Math.random() * (Max - Min)
于 2012-09-15T18:29:08.253 回答
0

以下是步骤:

  1. 生成 n 个数字
  2. 使用StringBuilder
  3. 使用创建您的号码BigInteger(String)

这是一些代码:

public static BigInteger randomBigInt(int digits, Random rand) {
    StringBuilder sb = new StringBuilder(digits);

    // First digit can't be 0
    sb.append(rand.nextInt(9) + 1);

    int limit = digits - 1;
    for (int i = 0; i < limit; i++)
        sb.append(rand.nextInt(10));

    return new BigInteger(sb.toString());
}

这会分别生成每个数字并将它们添加到 a StringBuilder(与aint或其他可能会产生缓冲区溢出问题的东西相反),然后使用结果String来创建BigInteger. 另请注意,第一个数字永远不会是 0。

于 2012-09-15T18:52:58.223 回答
-1

使用像这里的 RandomUtil 类这样的随机生成器,您可以在一些值之间生成随机数等等。

例如,使用此代码将在 min=100000000000000 max=999999999999999 的范围内为 15 位数字:

BigInteger number = RandomUtil.getRandomBigInteger(new BigInteger("100000000000000"), new BigInteger("999999999999999"), false);
于 2015-07-29T15:20:58.007 回答