Java随机数生成器

4

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


1
请查看Jon Skeet在https://dev59.com/z3E95IYBdhLWcg3wft5w的答案。 - Don Roby
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);

点击此处查看演示。


以上代码为什么无法生成一个“0”作为结果,而不是一个30位数字? - codaddict
@codaddict 可以说,这是一个有30个零的30位随机数。如果您不想在您的30位数中有前导零,您可以始终在循环中运行它。 - Sergey Kalinichenko
是的,这个检查不仅需要针对所有零,还需要针对任何生成的小于1^30的数字。 - codaddict
@codaddict 我添加了一个循环来确保数字在前导位置没有零。 - Sergey Kalinichenko
我认为我更喜欢“29 + 1”的方法,因为你可以确信只需要运行一次代码。 - Johanneke
显示剩余4条评论

4

您可以随机生成数字的每个单独的数字。对于一个15位数,您可以随机生成15个数字,然后组成这个数。

另一种方法:

让我们将问题改为生成随机的5位数。

Min = 10000
Max = 99999

现在生成一个介于 0Max - Min 之间的随机数,其中 Max - Min89999,然后将其加上 Min
Random = Min + Math.random() * (Max - Min)

我喜欢这个简单的解决方案!没有循环或其他什么,只是纯粹而简单的数学 :) - Johanneke

0

以下是步骤:

  1. 生成n个数字
  2. 使用StringBuilder将它们组合起来
  3. 使用{{link1: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());
}

这将每个数字分别生成并添加到StringBuilder中(而不是int或其他类型,这可能会导致缓冲区溢出问题),然后使用生成的String创建BigInteger。还请注意,第一个数字永远不会为0。


啊,这个答案可以计算小于n位数的数字。我会修改我的答案。对此很抱歉 :X - Brian

-1

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

例如,使用此代码将在以下范围内生成15位数: min=100000000000000 max=999999999999999:

BigInteger number = RandomUtil.getRandomBigInteger(new BigInteger("100000000000000"), new BigInteger("999999999999999"), false);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接