gpt4 book ai didi

c++ - 将 C++ 随机数分布传递给函数

转载 作者:行者123 更新时间:2023-11-30 04:56:32 26 4
gpt4 key购买 nike

我找过类似的问题,但没有找到。我想生成正态分布的随机数。我以前用 C 和一些 C++98 编写代码,但现在我想回去学习 C++11。

我有一个返回种子 RNG 的函数

auto seeded_rng () {
.... //do seeding.
std::default_random_engine Eng(/*seeds*/);
return Eng;
}

在我的主要功能中,我将 RNG 绑定(bind)为高斯分布

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){}

但是它在提示。我应该使用什么类型将“绑定(bind)”分布传递给构造函数?还是我完全错误地解决了这个问题。我应该只在全局范围内声明 RNG 引擎吗?我不想那样做。

抱歉,如果这是非常基本的!

最佳答案

sim 的参数类型与绑定(bind)的类型不匹配。当您创建绑定(bind)时,您可以通过使用 auto 而不是声明类型来避免该问题,但稍后您将需要它。如何在类 sim 中使用以下内容,而不是尝试提前找出类型。这还允许您在不更改 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)类型的方法。

由于绑定(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 中移除

关于c++ - 将 C++ 随机数分布传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52445413/

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