In a Java project, I use the same unique Random
object all over my code. I usually create it without a seed, but when debugging it is useful to initialize it with a seed so I get reproducible runs.
I am using Apache Commons Math 3.6 and its NormalDistribution
class takes a RandomGenerator
object. RandomGenerator
is of course a different interface from Random
, so I cannot just pass my unique Random
object to NormalDistribution
.
To keep the ability to introduce a single seed to a single random number generator and obtain reproducible runs, I create the RandomGenerator
(specifically, its implementation JDKRandomGenerator
) for NormalDistribution
with a seed that comes from my unique Random
object (using Random.nextInt()
):
NormalDistribution(new JDKRandomGenerator(myUniqueRandom.nextInt()), mean, standardDeviation);
The reasoning is that, when I introduce a seed to the Random
object, it will pass the same seed every time to the RandomGenerator
and things will be reproducible.
Things seemed to be working but after a while I realized that the variance I was getting in my results was far from what it should have been. After some debugging I realized that if I don't pass a seed to JDKRandomGenerator
from my unique Random
(or use the NormalDistribution
constructor that doesn't take a random number generator at all), then things work fine and the variance is what it should be. However, now I don't have the ability to obtain reproducible runs anymore.
Any idea why passing a RandomGenerator
a seed coming from Random.nextInt()
didn't work? It sounds like it should.
Aucun commentaire:
Enregistrer un commentaire