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