positivo - Números aleatorios de Java usando una semilla
numero aleatorio positivo java (7)
Este es mi código para generar números aleatorios usando una semilla como argumento:
double randomGenerator(long seed) {
Random generator = new Random(seed);
double num = generator.nextDouble() * (0.5);
return num;
}
Cada vez que doy una semilla y trato de generar 100 números, todos son iguales.
¿Cómo puedo arreglar esto?
El problema es que siembras el generador aleatorio nuevamente. Cada vez que lo siembras, el estado inicial del generador de números aleatorios se restablece y el primer número aleatorio que generes será el primer número aleatorio después del estado inicial.
Ese es el principio de un Pseudo- RNG. Los números no son realmente aleatorios. Se generan usando un algoritmo determinista, pero dependiendo de la semilla, la secuencia de números generados varía. Como siempre usas la misma semilla, siempre obtienes la misma secuencia.
La manera más fácil es usar:
Random rand = new Random(System.currentTimeMillis());
Esta es la mejor manera de generar números Random
.
No debería crear un nuevo Random en el alcance del método. Conviértalo en un miembro de la clase:
public class Foo {
private Random random
public Foo() {
this(System.currentTimeMillis());
}
public Foo(long seed) {
this.random = new Random(seed);
}
public synchronized double getNext() {
return generator.nextDouble();
}
}
Esto es solo un ejemplo. No creo que envolver Random
esta manera agregue ningún valor. Póngalo en una clase suya que lo esté usando.
Si desea generar múltiples números usando una semilla, puede hacer algo como esto:
public double[] GenerateNumbers(long seed, int amount) {
double[] randomList = new double[amount];
for (int i=0;i<amount;i++) {
Random generator = new Random(seed);
randomList[i] = Math.abs((double) (generator.nextLong() % 0.001) * 10000);
seed--;
}
return randomList;
}
Mostrará la misma lista si usa la misma semilla.
Si estás dando la misma semilla, eso es normal. Esa es una característica importante que permite las pruebas.
Compruébelo para comprender la generación pseudoaleatoria y las semillas:
Generador de números pseudoaleatorios
Un generador de números pseudoaleatorios (PRNG), también conocido como generador de bits aleatorios determinístico DRBG, es un algoritmo para generar una secuencia de números que se aproxima a las propiedades de los números aleatorios. La secuencia no es verdaderamente aleatoria ya que está completamente determinada por un conjunto relativamente pequeño de valores iniciales, denominado estado del PRNG, que incluye una semilla verdaderamente aleatoria.
Si desea tener diferentes secuencias (el caso habitual cuando no está afinando o depurando el algoritmo), debe llamar al constructor de argumentos cero que utiliza nanoTime para tratar de obtener una semilla diferente cada vez. Esta instancia Random
, por supuesto, debe mantenerse fuera de su método.
Tu código probablemente debería ser así:
private Random generator = new Random();
double randomGenerator() {
return generator.nextDouble()*0.5;
}
Varios de los ejemplos aquí crean una nueva instancia Random
, pero esto es innecesario. Tampoco hay razón para usar synchronized
como lo hace una solución. En su lugar, aprovecha los métodos de la clase ThreadLocalRandom
:
double randomGenerator() {
return ThreadLocalRandom.current().nextDouble(0.5);
}