繁体   English   中英

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

[英]How to write a function to create and return a random engine in c++

我一直在努力使用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 ++比较陌生。 我们对我的代码或显示您的方法的任何帮助将不胜感激。

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::seed_seq 因此,尽管只有一个元素,但大括号表达式使您更明确地希望将其作为列表。 但是,一对括号使表示法有些含糊,我的c语误解了您的意图。

请参阅https://en.cppreference.com/w/cpp/numeric/random/seed_seq/seed_seq中的示例,建议使用花括号进行初始化。

暂无
暂无

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

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