When writing code that requires multiple independent random number distributions/sequences (example below with two), it seems that there are two typical ways to implement (pseudo-)random number generation. One is simply using a random_device
object to generate two random seeds for the two independent engines:
std::random_device rd;
std::default_random_engine en(rd());
std::default_random_engine en2(rd());
std::uniform_real_distribution<> ureald{min,max};
std::uniform_int_distribution<> uintd{min,max};
The other involves using the random_device
object to create a seed_seq
object using multiple "sources" of randomness:
std::random_device rd;
std::seed_seq seedseq{rd(), rd(), rd()}; // is there an optimal number of rd() to use?
std::vector<uint32_t> seeds(5);
seedseq.generate(seeds.begin(), seeds.end());
std::default_random_engine en3(seeds[0]);
std::default_random_engine en4(seeds[1]);
std::uniform_real_distribution<> ureald{min,max};
std::uniform_int_distribution<> uintd{min,max};
Out of these two, is there a preferred method? Why? If it is the latter, is there an optimal number of random_device
"sources" to use in generating the seed_seq
object?
Are there better approaches to random number generation than either of these two implementations I've outlined above?
Thank you!
Aucun commentaire:
Enregistrer un commentaire