¿Cómo se genera un número entero n dígitos al azar en Java utilizando la clase BigInteger?

StackOverflow https://stackoverflow.com/questions/3709521

  •  02-10-2019
  •  | 
  •  

Pregunta

No estoy seguro acerca de cómo generar un número entero de dígitos al azar n en Java utilizando la clase BigInteger.

¿Fue útil?

Solución

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();
}

Y a continuación, se puede usar:

new BigInteger(getRandomNumber(10000))

Otros consejos

De acuerdo con los documentos, hay un constructor para hacer lo que quiera en Java 6: BigInteger (int, java.util.Random)

Para eso, sólo tiene que añadir un número 5.000 dígitos, es decir seleccionada al azar. Utilice el constructor RNG para 4999 dígitos, el añadir el pasado en medio de un proceso aleatorio separada. En realidad, ya que desea un rendimiento simplemente muestra para valores grandes, podría generar los bits, y un virar un bit en la gran final, en lugar de esclavo de notación decimal.

La forma más sencilla sería probablemente ser para llenar una matriz de caracteres [] con 5000 dígitos al azar, que convertido en una cadena, y luego llama al constructor BigInteger(String).

Si cualquiera de esos pasos que da problemas, por favor, dar más detalles.

Como alternativa, podría hacer algo como esto:

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);
}

Sospecho que habría aunque bastante menos eficiente.

Se podría reducir el número de pasos necesarios mediante la generación de nueve dígitos al azar a la vez, con rng.nextInt(1000000000).

Aquí hay dos versiones, una toma aleatoria como parámetro (en caso de que quiera volver a utilizarlo):

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));
}

El BigInteger resultante siempre tendrá la longitud especificada.

Si n es entre 1 a 12 método a continuación, siguiendo ayuda

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);
}

Uno más cosa a destacar es que no está bien código de prueba.

Tome una cadena con 5000 dígitos en que entonces convertirlo en BigInteger.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top