假设我们只实例化少于 20 个 Blob 类对象,并且考虑到效率(执行时间)和内存管理问题,是否有最佳选择:
-
将随机生成器和生成的分布设置为私有类成员,例如:
class Blob {
private:
std::mt19937 engine;
std::uniform_real_distribution<double> R_distribution;
std::binomial_distribution<int> B_distribution;
}
并直接在 Blob 方法中使用它们。因此,当我们调用分发时,我们也会更改作为成员的引擎的状态。
-
或者将随机生成器设置为私有类成员并通过引用方法传递分布?例如:
class Blob {
private:
std::mt19937 engine; //engine
}
void Blob::run() {
int blabla = 10;
std::uniform_real_distribution<double> R_distribution(0, 10);
do_something(blabla, R_distribution);
...
}
虽然通过引用传递通常会降低开销,但在这种情况下特别重要吗?当多次调用分布(10^9 或更多)时,总体问题如何扩展?
分布是cheap并且可以随意创建/丢弃。发动机则不然。理想情况下,您应该只初始化您的 PRNGonce并确保它是thread_local
如果你的程序是多线程的。 PRNG就像std::mt19937
体积庞大并且具有较大的内部状态。考虑做这样的事情:
inline auto global_rng() -> std::mt19937& {
thread_local std::mt19937 e{ get_seed() };
return e;
}
void foo() {
thread_local std::uniform_real_distribution<double> d;
// ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)