可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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.