2010-09-14 6 views
15

Я не уверен, как сгенерировать случайное число n цифр в Java, используя класс BigInteger.Как создать случайное число n цифр в Java, используя класс BigInteger?

+0

Хм ... лучший способ - создать его из полностью случайных 32-битных или 64-битных номеров. Не уверен, поддерживает ли это API. –

+0

Ммм ... Я никогда этого не делал, но я считаю, что сейсморазведчик дал лучшее решение, чем мое. Вместо этого вы должны принять его ответ. Я полагаю, что когда вы говорите «5000 цифр чисел», вы имеете в виду, что первая цифра не равна 0, и мой ответ не соответствует этому. –

ответ

11
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)) 
+0

неплохо, вам нужен специальный случай для первой цифры, но –

+0

@seanizer: если мы хотим равномерного распределения на диапазоне 1x..x - 9..9, тогда вы правы. Я принял равномерное распределение по всему диапазону. +1 по вашему ответу :) –

+0

По какой-то причине я иногда получаю длину 17 вместо 18 –

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).

+1

Обратите внимание, что это даст вам случайное распределение между 1 и 10^5000, поэтому некоторые номера, созданные этим, не будут содержать 5000 цифр. Если требуется равномерное распределение среди всех 5000 цифр, то первая цифра должна быть сделана в специальный случай, выбранный rng.nextInt (9) +1. – oksayt

+1

@oksayt: Да, я почти упомянул об этом ... тогда решил не быть таким придирчивым;) –

+0

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

0

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

5

Согласно документации, есть конструктор, чтобы сделать то, что вы хотите в Java 6: BigInteger(int, java.util.Random)

В связи с этим, вам нужно только добавить случайно выбранный значного-5000-т.е. Используйте конструктор rng для 4999 цифр, добавьте последний в отдельный случайный процесс. Фактически, поскольку вы хотите просто пробовать производительность для больших значений, вы можете сгенерировать биты и привязать один бит к большому концу, а не подчиняться десятичной нотации.

+0

Это дает количество * бит *, а не * цифр *, что сделает его хотя бы * слегка * затруднительно, если OP хочет случайное распределение более 5000 цифр. В основном генерируйте случайное значение, которое может быть слишком большим, и затем повторяйте, пока не появится разумный. –

+0

@Jon: см. Править; если op является гибким в отношении того, что означает «размер» для его вопроса, 5000 бит (так далее) могут быть столь же хорошими, как 5000 цифр. Кроме того, мой телефон засасывает ответы на вопросы. – Carl

+0

Да, я хочу цифры, а не биты. Я использовал этот конструктор, который вы упомянули, а потом понял, что он просто дает число от 0 до 2^numbits - 1, а не 5000 ЦИФРОВОГО целого – makaveli2178

2

Вот два варианта, один принимает в качестве параметра 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

Если п от 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); 
} 

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