如何生成大于 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);