gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:18:54 26 4
gpt4 key购买 nike

我一直在为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com