c++ - 计算分布的逆CDF

标签 c++ c++11 random

我想使用 <random> 中提供的分布来计算CDF逆计算。我看到正态分布具有以下方法

template<class Generator>
result_type std::normal_distribution<RealType>::operator()(Generator& g);
哪里

g - an uniform random bit generator object


我的想法是制作一个仅传递单个值的自定义生成器(我想为其查找x反向值的可能性)。
class ConstantGenerator
{
public:
    ConstantGenerator(double value) : m_value(value) {}
    double min() const { return 0.0; }
    double max() const { return 1.0; }
    double operator()(){ return m_value; }
    using result_type = double;
private:
    double m_value = 0.0;
};
用法示例为
int main()
{
    std::normal_distribution<double> dist{10.0, 1.0};
    ConstantGenerator gen{0.5};
    std::cout << dist(gen);
}
In this example,我创建了一个均值= 10,StdDev = 1的正态分布,因此我希望通过dist(gen)传递的p=0.5调用将返回10(均值),但它返回1.46885
如何修改ConstantGenerator以使用现有的C++ 11发行版执行CDF逆计算?还是我以为operator()首先执行逆CDF的假设是否正确?

最佳答案

std::normal_distribution不是正态分布函数。取而代之的是,该函数接收随机位(例如已经提到的Severin Pappdeux),并输出正态分布的值。标准中没有定义输入位使用方式的内容。
我可以想到的std::normal_distribution的可能实现如下:当您想要一个正态分布的值时,它将多次调用随机位生成器,并假设该生成器的输出是均匀分布的,然后将这些输出映射到期望的范围内。浮点值,然后将这些值取平均值。您可以看到,如果给它提供始终提供相同值的生成器,则此方法将无法按预期工作。ConstantGenerator的另一个问题是它不遵循requirements for UniformRandomBitGenerator;特别是,输出应为无符号整数。
您可以尝试自己实现inverse CDF of the normal distribution

关于c++ - 计算分布的逆CDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62955446/

相关文章:

c++ - 内存分配 - Arduino

c++ - 将数据从较小的 vector 复制到较大的 vector

c++ - 模板: class specialization

c++ - 当一个函数没有为 1 个输入参数提供 1 个输出参数时,如何使 "compose"起作用?

java - 静态Math.随机变化java

java - 如何通过哈希随机化(在 Java 中)?

c++ - 二项式随机数生成

c++ - 以逻辑单位表示的 CDC 区域大小?

c++ - 使用 std::move 进行 vector 构建优化

c++ - 使用 extern 的显式实例化声明