是否有可能让用户选择随机大整数的位数?例如,如果用户希望它是15位长,则随机数生成器将仅产生15位长的大整数。
是否有可能让用户选择随机大整数的位数?例如,如果用户希望它是15位长,则随机数生成器将仅产生15位长的大整数。
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);
点击此处查看演示。
您可以随机生成数字的每个单独的数字。对于一个15位数,您可以随机生成15个数字,然后组成这个数。
另一种方法:
让我们将问题改为生成随机的5位数。
Min = 10000
Max = 99999
0
和 Max - Min
之间的随机数,其中 Max - Min
为 89999
,然后将其加上 Min
。Random = Min + Math.random() * (Max - Min)
以下是步骤:
StringBuilder
将它们组合起来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。
使用像这个RandomUtil类一样的随机生成器,您可以生成在某些值之间的随机数字等等。
例如,使用此代码将在以下范围内生成15位数: min=100000000000000 max=999999999999999:
BigInteger number = RandomUtil.getRandomBigInteger(new BigInteger("100000000000000"), new BigInteger("999999999999999"), false);