seed mt19937 with random data
time(NULL) is a poor seed. It is quite predictable and multiple instance starting in the same second will get the same seed and therefore the same pseudo random number sequence Use std::random_device, witch is meant to provide 'true' random data.. mix time(NULL) just in case the std implementation is crappy. PS: sadly std::random_device.entropy() cannot be relied on as clang and gcc are known to return 0 despite their random_device being non-deterministic, hence the prophylactic systematic mixing with time(null) Change-Id: I44dab9970f8f0388dc1c99e9816d49d1afbecf18 Reviewed-on: https://gerrit.libreoffice.org/15591 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <mstahl@redhat.com>
This commit is contained in:
committed by
Michael Stahl
parent
9503fe93e0
commit
011563a083
@@ -37,12 +37,13 @@ struct RandomNumberGenerator
|
|||||||
STD_RNG_ALGO global_rng;
|
STD_RNG_ALGO global_rng;
|
||||||
RandomNumberGenerator()
|
RandomNumberGenerator()
|
||||||
{
|
{
|
||||||
|
std::random_device rd;
|
||||||
// initialises the state of the global random number generator
|
// initialises the state of the global random number generator
|
||||||
// should only be called once.
|
// should only be called once.
|
||||||
// (note, a few std::variate_generator<> (like normal) have their
|
// (note, a few std::variate_generator<> (like normal) have their
|
||||||
// own state which would need a reset as well to guarantee identical
|
// own state which would need a reset as well to guarantee identical
|
||||||
// sequence of numbers, e.g. via myrand.distribution().reset())
|
// sequence of numbers, e.g. via myrand.distribution().reset())
|
||||||
global_rng.seed(time(NULL));
|
global_rng.seed(rd() ^ time(nullptr));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user