如何生成大于 2**64 的随机 BigIntegers
How to generate random BigIntegers larger than 2**64
我需要随机大整数来检查数字是否为质数(有一种方法可以做到这一点),但这个数字必须从 264 开始。堆栈溢出中有一个答案 how to random BigIntegers from x to y,但我不知道如何将 264 放入此方法中。有什么办法吗?
BigInteger randomNumber;
do {
randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);
我希望输出从 18 446 744 073 709 551 616 到任何更大的可用值。
首先随机化数字,然后随机生成每个数字并将它们附加在一起
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());
}
你的意思是乘以的幂?
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)
创建一个大于等于0且小于等于2^numberOfBits - 1
的正BigInteger。
通过添加 2^64 + 1
确保 randomNumber
大于 2^64
randomNumber.add( BigInteger.valueOf( 2 ).pow( 64 ).add( BigInteger.ONE ) );
首先用长度为 9 的字节数组创建数字 2^64:
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
一种简单的方法是简单地生成0到2maxbits-64 - 1的随机数,将低位设置为1,然后左移64位。
do {
randomNumber = new BigInteger(upperLimit.bitLength()-64, randomSource).or(BigInteger.ONE);
randomNumber = randomNumber.shiftLeft(64);
} while (randomNumber.compareTo(upperLimit) >= 0);
我需要随机大整数来检查数字是否为质数(有一种方法可以做到这一点),但这个数字必须从 264 开始。堆栈溢出中有一个答案 how to random BigIntegers from x to y,但我不知道如何将 264 放入此方法中。有什么办法吗?
BigInteger randomNumber;
do {
randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);
我希望输出从 18 446 744 073 709 551 616 到任何更大的可用值。
首先随机化数字,然后随机生成每个数字并将它们附加在一起
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());
}
你的意思是乘以的幂?
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)
创建一个大于等于0且小于等于2^numberOfBits - 1
的正BigInteger。
通过添加 2^64 + 1
randomNumber
大于 2^64
randomNumber.add( BigInteger.valueOf( 2 ).pow( 64 ).add( BigInteger.ONE ) );
首先用长度为 9 的字节数组创建数字 2^64:
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
一种简单的方法是简单地生成0到2maxbits-64 - 1的随机数,将低位设置为1,然后左移64位。
do {
randomNumber = new BigInteger(upperLimit.bitLength()-64, randomSource).or(BigInteger.ONE);
randomNumber = randomNumber.shiftLeft(64);
} while (randomNumber.compareTo(upperLimit) >= 0);