是否可以让用户选择随机数的位数,特别是随机大整数?例如,如果用户希望它为 15 位长,则随机数生成器将仅生成 15 位长的大整数。
问问题
15560 次
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
其添加到.0
89999
Min
Random = Min + Math.random() * (Max - Min)
于 2012-09-15T18:29:08.253 回答
0
以下是步骤:
- 生成 n 个数字
- 使用
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());
}
这会分别生成每个数字并将它们添加到 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 回答