Создание случайного числа BigInteger фиксированной длины в Java

Я пытаюсь сгенерировать случайный 20-значный BigInteger на Java.

До сих пор мне удавалось сгенерировать шестнадцатеричное значение фиксированной длины.

    // generate a user-specified number of random bytes
    public void getRandomNumber(int count) {

        byte[] bytes = new byte[count];
        new SecureRandom().nextBytes(bytes);
        String random = new String(Hex.encode(bytes));
        System.out.println(random);
    }

Это идеально подходит для генерации шестигранника фиксированной длины. Но я изо всех сил пытаюсь найти эффективный способ сделать это для десятичного представления; при преобразовании из шестнадцатеричного в BigInteger(hexValue, 16) длина будет изменяться.

Я подумал о том, чтобы попробовать это, установив верхнюю и нижнюю границы или создав что-то достаточно большое и обрезав до желаемой длины, но эти методы не кажутся очень чистыми.

Изменить: решение, которое я придумал, отлично работает в моей программе:

// generate a random number with specified bit length
    public void getTokenID() {
        int count = 64;
        SecureRandom rnd = new SecureRandom();
        BigInteger randomCountLength;
        String token;

        do {
            randomCountLength = new BigInteger(count, rnd);
            token = randomCountLength.toString();
        } while (token.length() != 20);

        Tid = token;
    }

person lb-99    schedule 17.02.2021    source источник
comment
Когда вы говорите «20 цифр», вы имеете в виду десятичные, шестнадцатеричные или двоичные цифры?   -  person Artjom B.    schedule 17.02.2021
comment
@ArtjomB. Извините, я имел ввиду десятичные числа. Думаю, я нашел решение своей проблемы - хотя, возможно, это не самое эффективное решение, я добавлю его в свой пост.   -  person lb-99    schedule 17.02.2021
comment
@ lb-99 лучше опубликовать самостоятельный ответ, чем редактировать свой ответ в сообщении. Это делает вещи ясными и разделенными и позволяет людям голосовать за ответ вместе со всеми остальными - возможно, это не лучшее решение. Спасибо.   -  person ggorlen    schedule 18.02.2021
comment
@ggorlen по какой-то причине у меня нет возможности ответить на этот вопрос - возможно, поскольку он был отмечен как повторяющийся?   -  person lb-99    schedule 18.02.2021


Ответы (1)


Насколько я понимаю, ваша проблема состоит в том, чтобы сгенерировать случайное число фиксированной длины (фиксированное количество цифр)

Очевидно, что использование шестнадцатеричного значения будет работать, поскольку любая шестнадцатеричная цифра представляет 4 байта. Поэтому, когда вы исправляете длину байтов (таблица байтов в своем коде), он работает нормально

Что я вам советую при работе с десятичными числами:

1- Существуют методы для генерации случайного числа с нижней и верхней границей, например Случайное число между 5 и 10, поэтому, если вы хотите, например, случайное число из 20 цифр, вам необходимо сгенерировать случайное число между (10 ^ 19) и ( 10 ^ 20-1)

2- Второй - жестко запрограммированный метод создания цикла из 20 итераций, когда вы генерируете случайную цифру (от 0 до 9, за исключением цифры сильного веса, которая должна быть между 1 и 9), и вы получаете число.

person NASSIM ADRAO    schedule 17.02.2021