Как генерировать случайные BigIntegers больше, чем 2 ** 64 - PullRequest
1 голос
/ 24 октября 2019

Мне нужно иметь случайные Большие Целые числа для проверки, является ли число простым (есть метод, который делает это), но эти числа должны начинаться с 2 64 . В переполнении стека есть ответ, как рандомизировать BigIntegers от x до y, но я не знаю, как поместить 2 64 в этот метод. Есть ли способ?

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

Я ожидаю, что выход будет от 18 446 744 073 709 551 616 к любому большему доступному.

Ответы [ 4 ]

1 голос
/ 24 октября 2019

Сначала вы создаете число 2 ^ 64 с байтовым массивом длины 9:

byte[] bytes = new byte[8+1];
bytes[0] = 1; // 0x01 0x00 0x00 0x00 .... 0x00
BigInteger base = new BigInteger(bytes);

И затем вы можете добавить любой случайный BigInteger, какой вам нравится, с помощью конструктора BigInteger(int, Random);.

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 голосов
/ 25 октября 2019

Один простой способ - просто сгенерировать случайные числа от 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);
0 голосов
/ 24 октября 2019

Вы имели в виду повышение до степени ?

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

Как генерировать случайное значение BigInteger в Java?

Конструкторpublic BigInteger(int numberOfBits, Random rnd) создает положительный BigInteger, больше равный 0 и менее равный 2^numberOfBits - 1. обеспечить randomNumber больше 2 ^ 64, добавив 2 ^ 64 + 1

randomNumber.add( BigInteger.valueOf( 2 ).pow( 64 ).add( BigInteger.ONE ) );
0 голосов
/ 24 октября 2019

сначала рандомизируйте цифры, затем случайным образом генерируйте каждую цифру и складывайте их вместе

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());
}
...