Как сгенерировать случайное целое число из n цифр в Java с помощью класса BigInteger? - PullRequest
15 голосов
/ 14 сентября 2010

Я не уверен, как генерировать случайное целое число из n цифр в Java с помощью класса BigInteger.

Ответы [ 6 ]

12 голосов
/ 14 сентября 2010
private static Random rnd = new Random();

public static String getRandomNumber(int digCount) {
    StringBuilder sb = new StringBuilder(digCount);
    for(int i=0; i < digCount; i++)
        sb.append((char)('0' + rnd.nextInt(10)));
    return sb.toString();
}

И тогда вы можете использовать его:

new BigInteger(getRandomNumber(10000))
5 голосов
/ 14 сентября 2010

Согласно документации, в java 6 есть конструктор, который делает то, что вам нужно:выбранная случайным образом 5000-ая цифра, т. е. используйте конструктор rng до 4999 цифр, добавьте последний через отдельный случайный процесс.На самом деле, поскольку вы хотите просто измерять производительность для больших значений, вы можете сгенерировать биты и добавить один бит на большой конец, а не подчинить десятичную нотацию.

3 голосов
/ 14 сентября 2010

Самый простой способ - заполнить массив char [] 5000 случайными цифрами, преобразовать его в строку, а затем вызвать конструктор BigInteger(String).

Если любой из этих шагов дает вампроблемы, пожалуйста, дайте более подробную информацию.

В качестве альтернативы, вы могли бы сделать что-то вроде этого:

Random rng = new Random(); // But use one instance throughout your app
BigInteger current = BigInteger.ZERO;
for (int i = 0; i < 5000; i++) {
    BigInteger nextDigit = BigInteger.valueOf(rng.nextInt(10));
    current = current.multiply(BigInteger.TEN).add(nextDigit);
}

Я подозреваю, что это было бы гораздо менее эффективно.

Вы можете уменьшить количество необходимых шагов, генерируя девять случайных цифр за раз, с помощью rng.nextInt(1000000000).

2 голосов
/ 14 сентября 2010

Вот две версии, одна принимает параметр Random в качестве параметра (в случае, если вы хотите использовать его повторно):

public static BigInteger getRandomNumber(final int digCount){
    return getRandomNumber(digCount, new Random());
}

public static BigInteger getRandomNumber(final int digCount, Random rnd){
    final char[] ch = new char[digCount];
    for(int i = 0; i < digCount; i++){
        ch[i] =
            (char) ('0' + (i == 0 ? rnd.nextInt(9) + 1 : rnd.nextInt(10)));
    }
    return new BigInteger(new String(ch));
}

Результирующий BigInteger всегда будет иметь указанную длину.

1 голос
/ 10 апреля 2014

Если n находится в диапазоне от 1 до 12, тогда поможет следующий метод

private String getRandom(int length) {
    if (length < 1 && length > 12) {
        throw new IllegalArgumentException("Random number generator length should be between 1 to 12");
    }
    long nextLong = Math.abs(random.nextLong());
    return String.valueOf(nextLong).substring(0, length);
}

Еще одна вещь, на которую следует обратить внимание, это то, что это не хорошо проверенный код.

0 голосов
/ 14 сентября 2010

Возьмите строку с 5000 цифрами, затем конвертируйте ее в BigInteger.

...