gpt4 book ai didi

c++ - 如何将 C++11 随机数生成器传递给函数?

转载 作者:IT老高 更新时间:2023-10-28 22:13:41 24 4
gpt4 key购买 nike

它们都继承自基类吗?我必须使用模板吗?

(我指的是这些http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15319/)

我现在正在这样做:

typedef std::mt19937 RNG;

然后

class Chooser {
public:
Chooser(RNG& rng, uint n, uint min_choices, uint max_choices):

换句话说,我正在传递对 RNG 的引用。我将如何传入任意生成器?

另外,我意识到这可能是一个不同的问题,但是如何将生成器传递给 STL?

std::random_shuffle(choices_.begin(), choices_.end(), rng);

好像没用。


通过生成器的解决方案:

typedef std::ranlux64_base_01 RNG;
typedef std::mt19937 RNGInt;

传递给 STL 的解决方案:

struct STL_RNG {
STL_RNG(RNGInt& rng): gen(rng) {}
RNGInt& gen;
int operator()(int n) { return std::uniform_int<int>(0, n)(gen); }
};

最佳答案

它们并非都从基类继承(这有点令人惊讶),但这并不重要,因为 C++ 仿函数不是这样工作的。

对于单一给定类型的任意 RNG,您在(现在)发布时得到了正确的结果。

如果你的意思是,我如何定义一个接受任何随机数生成器作为参数的函数。

template< class RNG > // RNG may be a functor object of any type
int random_even_number( RNG &gen ) {
return (int) gen() * 2;
}

由于类型推导,您不需要使用更多模板。


定义一个函数来接受不同的 RNG 比较棘手,因为从语义上讲,这需要一个通用的基本类型。您需要定义一个基本类型。

struct RNGBase {
virtual int operator() = 0;
virtual ~RNGBase() {};
};

template< class RNG >
struct SmartRNG : RNGBase {
RNG gen;

virtual int operator() {
return gen();
}
};

int random_even_number( RNGBase &gen ) { // no template
return (int) gen() * 2; // virtual dispatch
}

关于c++ - 如何将 C++11 随机数生成器传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2241327/

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