【问题标题】:Should a std::random_device be kept alive after seeding a pseudo-random engine?为伪随机引擎播种后,std::random_device 是否应该保持活动状态?
【发布时间】:2015-02-05 02:02:26
【问题描述】:

获取随机数的典型现代方法如下:

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 对象保持活动状态并为其命名?

【问题讨论】:

    标签: c++ c++11 random


    【解决方案1】:

    您可以看到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 提取种子后立即销毁它。

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多