gpt4 book ai didi

C++11 随机数分布在不同平台之间不一致——有什么替代方案?

转载 作者:IT老高 更新时间:2023-10-28 22:59:55 42 4
gpt4 key购买 nike

我正在寻找一组用于标准 C++11 引擎的可移植发行版,例如 `std::mt19937'(参见 http://en.cppreference.com/w/cpp/numeric/random)。

引擎实现一致地执行(即在不同平台上生成相同的序列 - 使用 Clang 和 MSVC 测试),但在不同平台上似乎实现不同。

因此,即使引擎产生相同的序列,似乎分布(例如 std::normal_distribution<double> )在不同平台上使用的样本数量不同(即产生不同的结果),这是 Not Acceptable 就我而言。

我是否可以使用遵循 C++11 随机模板的第 3 方库,但这将在流行平台上提供一致的值(查看对 GCC、MSVC 和 Clang/llvm 的支持)。

到目前为止我看过的选项是:

  • Boost.random(有点重,但很值得,因为它与 c++11 对应物非常匹配)
  • 从 libstd++ 克隆(也值得且可能可移植,但提取特定功能可能并不简单)
  • 创建我自己的类似 C++11 的随机分布

我需要制服、正常、毒药和瑞利。

最佳答案

我创建了自己的 C++11 发行版:

template <typename T>
class UniformRealDistribution
{
public:
typedef T result_type;

public:
UniformRealDistribution(T _a = 0.0, T _b = 1.0)
:m_a(_a),
m_b(_b)
{}

void reset() {}

template <class Generator>
T operator()(Generator &_g)
{
double dScale = (m_b - m_a) / ((T)(_g.max() - _g.min()) + (T)1);
return (_g() - _g.min()) * dScale + m_a;
}

T a() const {return m_a;}
T b() const {return m_b;}

protected:
T m_a;
T m_b;
};

template <typename T>
class NormalDistribution
{
public:
typedef T result_type;

public:
NormalDistribution(T _mean = 0.0, T _stddev = 1.0)
:m_mean(_mean),
m_stddev(_stddev)
{}

void reset()
{
m_distU1.reset();
}

template <class Generator>
T operator()(Generator &_g)
{
// Use Box-Muller algorithm
const double pi = 3.14159265358979323846264338327950288419716939937511;
double u1 = m_distU1(_g);
double u2 = m_distU1(_g);
double r = sqrt(-2.0 * log(u1));
return m_mean + m_stddev * r * sin(2.0 * pi * u2);
}

T mean() const {return m_mean;}
T stddev() const {return m_stddev;}

protected:
T m_mean;
T m_stddev;
UniformRealDistribution<T> m_distU1;
};

均匀分布似乎提供了很好的结果,而正态分布提供了非常好的结果:

100000 个值 -> 1 sigma 内的 68.159%; 95.437% 2 sigma 以内; 99.747% 在 3 sigma 内

正态分布使用 Box-Muller 方法,根据我目前所阅读的内容,这不是最快的方法,但对于我的应用程序来说它运行得足够快。

均匀分布和正态分布都应该适用于任何 C++11 引擎(使用 std::mt19937 测试)并且在所有平台上提供相同的序列,这正是我想要的。

关于C++11 随机数分布在不同平台之间不一致——有什么替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903356/

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