我需要使用随机的大整数来检查数字是否为质数(有一种方法可以做到这一点),但是此数字必须从2 64 开始。堆栈溢出中有一个答案,如何将BigIntegers从x随机分配到y,但我不知道如何在此方法中放入2 64 。有什么办法吗?
BigInteger randomNumber;
do {
randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);
我希望输出从18446744073709551616到任何更大的可用量。
答案 0 :(得分:1)
首先,创建一个数字2 ^ 64,其字节数组的长度为9:
byte[] bytes = new byte[8+1];
bytes[0] = 1; // 0x01 0x00 0x00 0x00 .... 0x00
BigInteger base = new BigInteger(bytes);
然后您可以使用BigInteger(int, Random);
构造函数添加任何您喜欢的随机BigInteger。
BigInteger r = new BigInteger(32, new Random());
System.out.println(base);
System.out.println(r);
System.out.println(base.add(r));
这将产生类似这样的结果:
18446744073709551616
1629299848
18446744075338851464
答案 1 :(得分:0)
首先将数字随机化,然后随机生成每个数字并将其附加在一起
public static BigInteger randomBigInteger () {
Random r = ...;
var digits = r.randomInt(65 - 2) + 2;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digits.length; i++) {
sb.append(r.randomInt(10));
}
return new BigInteger(sb.toString());
}
答案 2 :(得分:0)
您的意思是提高的力量?
BigInteger randomNumber;
do {
randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);
How to generate a random BigInteger value in Java?
构造函数public BigInteger(int numberOfBits, Random rnd)
创建一个正的BigInteger,大于等于0,小于等于2^numberOfBits - 1
。
通过添加2 ^ 64 +1来确保randomNumber
大于2 ^ 64
randomNumber.add( BigInteger.valueOf( 2 ).pow( 64 ).add( BigInteger.ONE ) );
答案 3 :(得分:0)
一种简单的方法是简单地生成0到2之间的随机数 maxbits-64 -1,将低位设置为1,然后向左移动64。
do {
randomNumber = new BigInteger(upperLimit.bitLength()-64, randomSource).or(BigInteger.ONE);
randomNumber = randomNumber.shiftLeft(64);
} while (randomNumber.compareTo(upperLimit) >= 0);