在播种伪随机引擎后,std :: random_device应该保持活动状态吗?

时间:2015-02-05 02:02:26

标签: c++ c++11 random

获取随机数的典型现代方法是这样的:

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对象保持活着并给它命名?

1 个答案:

答案 0 :(得分:2)

你可以看到std::mt19937的构造函数只接受一个result_type参数:http://www.cplusplus.com/reference/random/mersenne_twister_engine/mersenne_twister_engine/该页面还说result_type是第一个模板参数, std::mt19937uint_fast32_t。此参数取值。

从上面我们可以得出结论,没有(理智的)方式random_device的生命周期必须跨越engine的生命周期。您可以在从中提取种子后立即销毁random_device