作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在为 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
的单元素列表。因此大括号表达式使您更明确地希望将其作为列表,尽管只有一个元素。然而,一对括号使符号有点模棱两可,我的 clang 误会了你的意图。
请参阅 https://en.cppreference.com/w/cpp/numeric/random/seed_seq/seed_seq 中的示例, 推荐使用大括号初始化。
关于c++ - 如何在 C++ 中编写函数来创建和返回随机引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54228535/
我是一名优秀的程序员,十分优秀!