获取随机数的典型现代方法是这样的:
std::random_device rd;
std::mt19937 engine{rd()};
std::uniform_int_distribution<> dis{-10,10};
someInt = dis(engine);
我认为std::random_device
对象仅用于种子伪随机引擎。因此我认为我们可以写这个:
std::mt19937 engine{std::random_device{}()};
std::uniform_int_distribution<> dis{-10,10};
someInt = dis(engine);
后者不会使std::random_device
对象保持活跃状态,并且具有减轻出现名字的痛苦的优势。但我发现互联网上的很多例子都使用了以前的版本。
这是必须的,还是有理由让std::random_device
对象保持活着并给它命名?
答案 0 :(得分:2)
你可以看到std::mt19937
的构造函数只接受一个result_type
参数:http://www.cplusplus.com/reference/random/mersenne_twister_engine/mersenne_twister_engine/该页面还说result_type
是第一个模板参数, std::mt19937
是uint_fast32_t
。此参数取值。
从上面我们可以得出结论,没有(理智的)方式random_device
的生命周期必须跨越engine
的生命周期。您可以在从中提取种子后立即销毁random_device
。