Я не уверен, как сгенерировать случайное число n цифр в Java, используя класс BigInteger.Как создать случайное число n цифр в Java, используя класс BigInteger?
ответ
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))
неплохо, вам нужен специальный случай для первой цифры, но –
@seanizer: если мы хотим равномерного распределения на диапазоне 1x..x - 9..9, тогда вы правы. Я принял равномерное распределение по всему диапазону. +1 по вашему ответу :) –
По какой-то причине я иногда получаю длину 17 вместо 18 –
Простейший способ, вероятно, состоит в том, чтобы заполнить массив 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)
.
Обратите внимание, что это даст вам случайное распределение между 1 и 10^5000, поэтому некоторые номера, созданные этим, не будут содержать 5000 цифр. Если требуется равномерное распределение среди всех 5000 цифр, то первая цифра должна быть сделана в специальный случай, выбранный rng.nextInt (9) +1. – oksayt
@oksayt: Да, я почти упомянул об этом ... тогда решил не быть таким придирчивым;) –
int i; char [] num = new char [5000]; Random R = new Random(); для (i = 0; i <5000; i ++) { int j = R.nextInt (10) + 1; num [i] = (char) j; } Строка s = num.нанизывать(); BigInteger n = новый BigInteger (s); – makaveli2178
Возьмите строку с 5000 цифр в нем затем преобразовать его в BigInteger.
Согласно документации, есть конструктор, чтобы сделать то, что вы хотите в Java 6: BigInteger(int, java.util.Random)
В связи с этим, вам нужно только добавить случайно выбранный значного-5000-т.е. Используйте конструктор rng для 4999 цифр, добавьте последний в отдельный случайный процесс. Фактически, поскольку вы хотите просто пробовать производительность для больших значений, вы можете сгенерировать биты и привязать один бит к большому концу, а не подчиняться десятичной нотации.
Это дает количество * бит *, а не * цифр *, что сделает его хотя бы * слегка * затруднительно, если OP хочет случайное распределение более 5000 цифр. В основном генерируйте случайное значение, которое может быть слишком большим, и затем повторяйте, пока не появится разумный. –
@Jon: см. Править; если op является гибким в отношении того, что означает «размер» для его вопроса, 5000 бит (так далее) могут быть столь же хорошими, как 5000 цифр. Кроме того, мой телефон засасывает ответы на вопросы. – Carl
Да, я хочу цифры, а не биты. Я использовал этот конструктор, который вы упомянули, а потом понял, что он просто дает число от 0 до 2^numbits - 1, а не 5000 ЦИФРОВОГО целого – makaveli2178
Вот два варианта, один принимает в качестве параметра 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 до 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);
}
Еще одна вещь, чтобы отметить, что это не хорошо протестирована код.
Хм ... лучший способ - создать его из полностью случайных 32-битных или 64-битных номеров. Не уверен, поддерживает ли это API. –
Ммм ... Я никогда этого не делал, но я считаю, что сейсморазведчик дал лучшее решение, чем мое. Вместо этого вы должны принять его ответ. Я полагаю, что когда вы говорите «5000 цифр чисел», вы имеете в виду, что первая цифра не равна 0, и мой ответ не соответствует этому. –