繁体   English   中英

初始化列表中的种子序列初始化

[英]Seed sequence initialization in initialization list

我目前正在尝试实现一个使用接受拒绝方法的随机数生成器(类)。 因此,我需要不同的C ++ 11随机数分布(在我的情况下为正态分布和均匀分布)。 我想使随机数尽可能地好,因此想使用以下内容来构建函数:

 [...]
 #include <random>
 #include <vector>
 [...]
 std::vector<int> seeds(16);   
 std::mt19937 mt;
 std::minstd_rand seed_rng(101); // random seed  
 for(size_t i=0;i<16;++i) seeds[i]=seed_rng();
 std::seed_seq seq(seeds.begin(), seeds.end());
 mt.seed(seq);
 rng_normal = std::bind(ndist, std::ref(mt));
 [...]

这很完美。 但是,当我尝试将所有这些内容现在放入构造函数中时,我将无法再使用种子序列的初始化。 我检查了c ++参考,但只遇到了std :: seed_seq :: generate,这不是正确的解决方案。
填充向量后,是否可以在初始化列表中构造seed_seq? 有关seed_seq的参考,请参见此处:
http://en.cppreference.com/w/cpp/numeric/random/seed_seq
谢谢您的任何建议!

假设您对保留用于构造mt19937seed_seq实例不感兴趣,则可以执行以下操作:

 struct foo
 {
    std::mt19937 mt;
    std::normal_distribution<> ndist;
    std::function<decltype(mt)::result_type()> rng_normal;

    foo()
    : mt{make_mersenne_twister()}
    , rng_normal{std::bind(ndist, std::ref(mt))}
    {}

    static std::mt19937 make_mersenne_twister()
    {
        std::minstd_rand seed_rng(std::random_device{}()); // random seed
        std::vector<int> seeds(16);

        std::generate(seeds.begin(), seeds.end(), seed_rng);

        std::seed_seq seq(seeds.begin(), seeds.end());
        return std::mt19937{seq};
    }
 };

我用std::random_device替换了您的种子( 101 )。

保留seed_seq的问题在于它既不可复制又不可移动,因此不可能将其构造委托给像我与Mersenne Twister一起使用的功能。

现场演示

我严重怀疑您的改进是否值得。 在C ++标准中指定了std :: mt19937的单个值(和默认值)构造函数。 相当于

static constexpr size_t WS = 32;
static constexpr result_type IM = 1812433253;
static constexpr result_type default_seed = 5489u;

explicit mt19937(result_type value = default_seed)
{
    state[0] = value;
    for (int i = 1; i != state_size; ++i)
    {
        state[i] = i + IM * (state[i - 1] ^ (state[i - 1] >> (WS - 2)));
    }
}

因此,它使用XOR-SHIFT随机数生成器填充状态数组。 考虑到参与制定此种子算法的人员以及致力于将<random>纳入标准的人员,我认为可以断定他们知道std :: minstd_ran,但发现上述优点优于播下梅森·Twister。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM