【问题标题】:seeding default_random_engine?播种 default_random_engine?
【发布时间】:2014-02-28 21:10:13
【问题描述】:

我正在使用不支持<chrono> 的Visual Studio 2010,所以我必须播种default_random_engine。因此,我决定使用rand 播种,如下所示

srand((unsigned int)time(NULL));
std::default_random_engine engine(rand());
std::normal_distribution<double> randn(0.0, 0.3);

而不是下面的

unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine engine(seed);
std::normal_distribution<double> randn(0.0, 0.3);

我得到了我期望通过这两种方法获得的东西。我的问题是使用 rand() 有什么需要注意的地方吗? (注:我别无选择使用&lt;chrono&gt;

【问题讨论】:

标签: visual-studio-2010 c++11 random


【解决方案1】:

我建议从std::random_device获取种子:

std::default_random_engine engine(std::random_device{}());

它应该为您提供比std::time 更多的熵。

【讨论】:

    【解决方案2】:

    根据http://www.cplusplus.com/reference/random/random_device/,他们建议您不要使用std::random_device,因为它不可移植:

    请注意,随机设备可能并不总是可用于生产 随机数(在某些系统中,它们甚至可能永远不会 可用)。

    在相关页面 (http://www.cplusplus.com/reference/random/linear_congruential_engine/linear_congruential_engine/) 上,他们给出了以下作为创建种子的示例:

    unsigned seed1 = std::chrono::system_clock::now().time_since_epoch().count();
    

    【讨论】:

    • 两个答案都是正确的,但这是最安全的。如果在 PRNG 中获得最大熵很重要,还可以检查 random_device 的熵(如果使用 prng 生成种子,std::random_device::entropy() 返回 0,因此不是一个好的选择)如果太低,则使用上面的 time_since_epoch() 调用。
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2016-08-31
    • 2012-10-18
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多