Necesito generar enteros aleatorios arbitrariamente grandes en el rango de 0 (inclusive) a n (exclusivo). Mi idea inicial era llamar al nextDouble
y multiplicar por n, pero una vez que n llega a ser mayor que 2 , los resultados ya no se distribuirán uniformemente.¿Cómo generar un valor BigInteger aleatorio en Java?
BigInteger
tiene la siguiente constructor disponibles:
public BigInteger(int numBits, Random rnd)
Construye un BigInteger generado aleatoriamente, uniformemente distribuida en el intervalo de 0 a (2 numBits - 1), ambos inclusive.
¿Cómo se puede utilizar esto para obtener un valor aleatorio en el rango 0 - n, donde n no es una potencia de 2?
y qué tan lento son los RNG típicos de Java? ¿Son los más comunes lo suficientemente lentos como para justificar este código adicional? – JeremyKun
Java proporciona un RNG criptográficamente seguro en 'java.security.SecureRandom' que, en mi PC, parece producir un poco más de 4 MBytes de alea por segundo. Esto depende de la implementación de Java (aquí Sun/Oracle Java 1.6.0_26), la arquitectura (Intel Core2, 2.4 GHz, modo de 64 bits) y el sistema operativo (Linux). –