c++ - 将 C++ 随机数分布传递给函数
问题描述
我一直在寻找类似的问题,但没有找到。我想生成正态分布的随机数。我曾经编写过 C 和一些 C++98 的代码,但现在我想回去学习 C++11。
我有一个返回种子 RNG 的函数
auto seeded_rng () {
.... //do seeding.
std::default_random_engine Eng(/*seeds*/);
return Eng;
}
在我的主要功能中,我将 RNG 绑定为高斯分布
auto binded = std::bind(std::normal_distribution<double>{0,1.0},seeded_rng);
此功能工作正常。我可以直接在 main 中调用“binded()”并生成数字
我想要一个需要创建随机数的模拟对象。我的问题与如何传入下面的“RNG_PART”有关。
class sim
{
public:
sim( RNG_PART & rng, int_number_of sims ){ /* Do whatever */}
}
因此,如果在 main 中,我想创建一个模拟对象
sim A(binded, 100);
它抱怨。我试着声明
sim::sim(std::default_random_engine &rng, int number_of_sims){}
但它在抱怨。我应该使用什么类型将“绑定”分布传递给构造函数?还是我完全不正确地解决这个问题。我应该只在全球范围内声明 RNG 引擎吗?我不想那样做。
抱歉,如果这是非常基本的!
解决方案
sim 的参数类型与绑定的类型不匹配。创建绑定时,您可以通过使用auto
而不是声明类型来避免该问题,但稍后您将需要它。如何在模拟类中进行以下操作,而不是提前找出类型。这也允许您在不更改 sim 类的情况下更改 RNG 或随机分布:
template<typename T>
class sim
{
public:
sim(T& rng, int_number_of sims ){ /* Do whatever */}
请注意,模板定义必须对您使用它的地方可见,因此您不能将其放入 cpp 文件中,除非使用它的唯一代码在该文件中。通常,模板定义与声明它的位置在同一个 h 文件中。
然后,您将创建 sim 为:
sim<decltype(binded)> A(binded,100);
这decltype(binded)
是一种告诉 sim 函数模板绑定类型的方法。
由于 bind 可以根据选择的随机数分布返回不同的类型,因此在 sim 类模板中获取返回类型可以通过
using rnd_return_type = typename std::result_of<T()>::type; //in C++11, C++14
或者
using rnd_return_type = std::invoke_result_t<T>; //C++17 and later
std::result_of
在 C++17 中已弃用,将在 C++20 中删除
推荐阅读
- windows - 无法在 Windows cmd 中启动 scrapyd
- postgresql - Postgresql Matches in 匹配两个表
- python - Json查找键包含一些字符并使用python将键和值写入新的json文件
- r - 即使库(rJava)工作正常,安装“RMongo”的问题也会引发 rJava 错误
- assembly - 错误 A2023 指令操作数必须具有 LGDT 指令的大小
- javascript - Redux-saga,yield call(history.push, 'pathname'),只在第一次工作,阻塞所有其他调用
- python - 累计收益
- python - render_to_string 给出错误,而渲染工作
- node.js - 无法使用nodeJS在ejs中呈现错误页面
- xamarin.forms - 如何在 ios 中设置 Xamarin.forms 选项卡页未选中的图标和文本颜色