Я не уверен, как сгенерировать случайное n-значное целое число в Java с использованием класса BigInteger.
Как сгенерировать случайное целое число из n цифр в Java, используя класс BigInteger?
Ответы (6)
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))
Согласно документам, в java 6 есть конструктор, который делает то, что вы хотите: BigInteger(int, java.util.Random)
К этому вам нужно только добавить случайно выбранную 5000-ю цифру, т.е. Используйте конструктор rng для 4999 цифр, добавьте последнюю через отдельный случайный процесс. На самом деле, поскольку вы хотите просто сэмплировать производительность для больших значений, вы можете сгенерировать биты и прикрепить один бит к большому концу, а не подчиняться десятичной записи.
Вероятно, самым простым способом было бы заполнить массив 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)
.
num
в строку, но вы не дали достаточно контекста, чтобы понять, что вы делаете неправильно. Пожалуйста, отредактируйте свой вопрос с полным примером.
- person Jon Skeet; 14.09.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 всегда будет иметь указанную длину.
Если 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);
}
Еще одна вещь, которую следует отметить, это то, что это не очень хорошо протестированный код.
Возьмите строку с 5000 цифрами, а затем преобразуйте ее в BigInteger.