c++ - 恒定的正确性和 <random>

标签 c++ c++11 random constants mutable

处理(否则)包含 C++11 随机类随机生成器调用的常量函数的正确方法是什么?您应该放弃函数的常量标志还是将生成器和分布声明为类的可变元素会更好? 一个最小的例子(不编译)可能是:

#include <random>

class foo 
{
  std::mt19937 MyGenerator;
  std::normal_distribution<precision_type> gauss;
  double get_rnd() const {return gauss(MyGenerator);}
};

最佳答案

这实际上取决于您为 const 成员访问提供的语义。

对于标准类,从多个线程同时调用const 成员是线程安全的。保留改变 RNG 的成员 const 会破坏它,除非 RNG 是完全线程安全的(对于非 const 使用)。

您不必以相同的方式设计您的类,但其他开发人员可能会发现无法同时安全地“读取”(调用 const 成员函数)的类会感到困惑.

一个选项是提供两种变体——使用内部存储的 RNG 的非常量版本,以及通过非常量引用接受 RNG 的 const 版本。 (第一个可以调用第二个,不需要const_cast)。这实现了“只为你需要的东西付费”的线程安全指南,因为如果每个线程都提供一个线程本地 RNG 实例,多个线程可以安全地使用该对象。它还允许使用模拟 RNG 实现进行测试,这可能更有值(value)。

关于c++ - 恒定的正确性和 <random>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26059611/

相关文章:

c++ - 递归函数中的许多参数会导致性能问题吗?

java - 根据百分比调用不同的任务

c++ - 在 C/C++ 中定义一个数字范围

c++ - 如何使用 C++11 风格的强类型定义创建新的原始类型?

c++ - 如果 unique_lock 在其生命周期内不再使用,是否应该在解锁后释放?

algorithm - 洗牌算法的快速想法 - 这行得通吗?

Swift:随机延迟只适用于第一次?随机数函数只执行一次?

c++ - 将 Boost::Beast 用于 CPU 密集型 REST API,我应该使用异步还是同步方式来实现它们以获得更好的延迟?

c++ - 为什么 GCC 允许在不首先使用其命名空间的情况下调用此函数?

c++ - 在分配 scoped_ptr 之前处理异常