seeding default_random_engine?

2019-04-10 09:34发布

问题:

I'm using visual studio 2010 which doesn't support <chrono>, so I have to seed default_random_engine. Thus, I've decided to seed it with rand as following

srand((unsigned int)time(NULL));
std::default_random_engine engine(rand());
std::normal_distribution<double> randn(0.0, 0.3);

instead of the following

unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine engine(seed);
std::normal_distribution<double> randn(0.0, 0.3);

I'm getting what I'm expecting to acquire for both methods. My question is are there any considerations should I pay attention to by using rand()? (Note: I have no choice to use <chrono>

回答1:

I recommend grabbing a seed from std::random_device:

std::default_random_engine engine(std::random_device{}());

which should provide you with significantly more entropy than std::time.



回答2:

According to http://www.cplusplus.com/reference/random/random_device/, they recommend that you don't use std::random_device, as it isn't portable:

Notice that random devices may not always be available to produce random numbers (and in some systems, they may even never be available).

On a related page (http://www.cplusplus.com/reference/random/linear_congruential_engine/linear_congruential_engine/), they give the following as an example of creating a seed:

unsigned seed1 = std::chrono::system_clock::now().time_since_epoch().count();