代码之家  ›  专栏  ›  技术社区  ›  Niko Z.

如何编写函数在C++中创建和返回随机引擎

  •  1
  • Niko Z.  · 技术社区  · 7 年前

    我一直在努力用C++生成伪随机数。我想写个方法 createRandEngine 渲染随机引擎。然后用其他方法 gaussian )使用此引擎生成随机数。我试过下面的代码,但在**行中有两个编译时错误。

    #include <random>
    
    typedef std::default_random_engine rand_engine;
    rand_engine createRandEngine(const int &seed)
    {
        std::seed_seq _s (unsigned(seed));
        rand_engine _eng(_s);  //**
    
        return _eng;    // Check if we can find alternative ways to render _eng
    }
    
    
    double gaussian(rand_engine &eng, const double &u, const double &std_dev)
    {
        std::normal_distribution<double> _g(u, std_dev);
        double _val = _g(eng);
        return _val;
    }
    
    
    int main ()
    {
        rand_engine eng = createRandEngine(20190117);
        double norm     = gaussian(eng, 0., 1.);
    
        std::cout << std::to_string(norm);
    }
    
    

    两个错误状态:

    error: no matching function for call to ‘std::linear_congruential_engine<long unsigned int, 16807ul, 0ul, 2147483647ul>::seed(std::seed_seq (&)(unsigned int))’
    
    
    error: no type named ‘type’ in ‘struct std::enable_if<false, void>’ linear_congruential_engine<_UIntType, __a, __c, __m>::
    

    我对C++是比较新的。任何帮助我的代码或显示您的方式,将是非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   adrtam    7 年前

    std::seed_seq 是C++ 11的东西,所以我相信在声明变量时可以使用括号语法:

    typedef std::default_random_engine rand_engine;
    rand_engine createRandEngine(const int &seed)
    {
        std::seed_seq _s {unsigned(seed)};
        rand_engine _eng {_s};
    
        return _eng;    // Check if we can find alternative ways to render _eng
    }
    

    正如我测试的,这将不会生成任何警告或错误(并使您将参数传递给构造函数的意图更加明确)。

    现在,让我们看看你为什么失败。您尝试初始化 _s 作为 std::__1::seed_seq(unsigned int) 类型(根据我的clang编译器),但您要做的是将一个元素列表传递给 STD:SythySeq . 因此,大括号表达式使您更明确地希望它作为一个列表,尽管只有一个元素。然而,一对括号会使符号有点模糊不清,我的clang误解了你的意图。

    示例见 https://en.cppreference.com/w/cpp/numeric/random/seed_seq/seed_seq 建议使用大括号初始化。