如何生成大于2 ** 64的随机BigIntegers

时间:2019-10-24 20:06:37

标签: java biginteger

我需要使用随机的大整数来检查数字是否为质数(有一种方法可以做到这一点),但是此数字必须从2 64 开始。堆栈溢出中有一个答案,如何将BigIntegers从x随机分配到y,但我不知道如何在此方法中放入2 64 。有什么办法吗?

BigInteger randomNumber;
do {
    randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);

我希望输出从18446744073709551616到任何更大的可用量。

4 个答案:

答案 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);