C++ equivalent of new Random(seed) in C#

匿名 (未验证) 提交于 2019-12-03 03:08:02

问题:

When we are using a random number generator in C#, we can define a variable like

private Random _rndGenerator; 

in a class and then call

_rndGenerator = new Random(seed); 

correctly in the constructor of the class.

My question is:

What is a C++ equivalent of such a definition (i.e. an RNG in a class). I think it is not a correct approach to use

srand((unsigned int)seed); 

right?

回答1:

C++11 has much more powerful random-number generation facilities. Here's an example:

#include <random> #include <functional>  std::size_t get_seed(); // whatever is the preferred way of obtaining a seed  typedef std::mt19937 engine_type; // a Mersenne twister engine std::uniform_int_distribution<engine_type::result_type> udist(0, 200);  engine_type engine;  int main() {   // seed rng first:   engine_type::result_type const seedval = get_seed();   engine.seed(seedval);    // bind the engine and the distribution   auto rng = std::bind(udist, engine);    // generate a random number   auto random_number = rng();    return random_number; } 

There are many ways to obtain seeds. <random> provides potential access to some hardware entropy with the std::random_device class, which you can use to seed your PRNGs.

std::size_t get_seed() {     std::random_device entropy;     return entropy(); } 


回答2:

C++ has a built-in global random number generator. If you want to seed it, then srand((unsigned int)seed) is the way to go. This isn't quite the same thing as the C# code that you showed, though. When you write:

Random _rndGenerator = new Random(seed); 

You get a separate random number generator instance. So you can have multiple random number generators in your program. To my knowledge, the C++ library doesn't have such a construct, although it appears that C++ 11 does.

In short, srand((unsigned int)seed) is correct if you're using older versions of C++, or if you just want one RNG in your program. If you need multiple RNGs, then use C++ 11, or roll your own.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!