问题描述
我正在尝试用 Java 生成一个随机的 20 位 BigInteger
。
到目前为止,我已经能够生成一个固定长度的十六进制值。
// generate a user-specified number of random bytes
public void getRandomNumber(int count) {
byte[] bytes = new byte[count];
new SecureRandom().nextBytes(bytes);
String random = new String(Hex.encode(bytes));
System.out.println(random);
}
这是固定长度十六进制生成的理想选择。但是我很难找到一种有效的方法来实现十进制表示;从十六进制转换为 BigInteger(hexValue,16)
时,长度会有所不同。
我曾考虑通过设置上限和下限来尝试这个,或者通过生成足够大的东西并修剪到所需的长度,但这些方法感觉不太干净。
编辑:我想出的解决方案在我的程序中运行良好:
// generate a random number with specified bit length
public void getTokenID() {
int count = 64;
SecureRandom rnd = new SecureRandom();
BigInteger randomCountLength;
String token;
do {
randomCountLength = new BigInteger(count,rnd);
token = randomCountLength.toString();
} while (token.length() != 20);
Tid = token;
}
解决方法
我了解到您的问题是生成固定长度(固定位数)的随机数
很明显,使用十六进制值是可行的,因为任何十六进制数字都代表 4 个字节。因此,当您修复字节长度(代码中的字节表)时,它可以正常工作
我在处理十进制数时的建议是:
1- 有一些方法可以生成具有下限和上限的随机数,例如 Random betwen 5 和 10,所以如果你想要一个 20 位的随机数,你必须在 (10^19 ) 和 (10^20-1)
2- 第二种是硬编码方法,当您生成随机数字(0 到 9 之间,强权重的数字必须在 1 到 9 之间)时,进行 20 次迭代的循环并获得数字。>