如何在类中编写一个有效的正态分布

How to write an efficient normal distribution inside a class

本文关键字:一个 有效 正态分布      更新时间:2023-10-16

我在相同的情况下运行我的项目(即当然除了随机数)。实验有时进行得很顺利,有时则不然。我怀疑随机生成器的实现方式。这是我使用标准STL

的解决方案
#include <random>
#include <iostream>
class Foo
{
public:
    Foo(){
      generator.seed(seeder);
    }
    double Normalized_Gaussain_Noise_Generator(){
       return distribution(generator);
    }
private:
    std::random_device seeder;
    std::default_random_engine generator;
    std::normal_distribution<double> distribution;
};
int main()
{
  Foo fo;
  for (int i = 0; i < 10; ++i)
  {
    std::cout << fo.Normalized_Gaussain_Noise_Generator() << std::endl;
  }
}

我也试过boost,一般来说,响应比我的STL方法好,这是代码。

#include <iostream>
#include <ctime>
#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>
class Foo
{
public:
    Foo() : generator(time(0)), var_nor(generator, boost::normal_distribution<double>() )
    {
    }

    double Normalized_Gaussain_Noise_Generator(){
        return var_nor();
    }
private:
    // Boost Case:
    boost::mt19937 generator;
    boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > var_nor;
};
int main()
{
  Foo fo;
  for (int i = 0; i < 10; ++i)
  {
    std::cout << fo.Normalized_Gaussain_Noise_Generator() << std::endl;
  }
}

我的第一个问题是我的方法有什么问题吗?如果是这样,在类中实现正态分布的最有效方法是什么?

Box-Muller(在评论中提到)是一种常见的方法,但与许多替代方法相比,它相对较慢,因为它依赖于超越函数(log, sin和cos)。它还与线性同余发生器有一个众所周知的相互作用,如果这些是统一的潜在来源,则会导致成对的值落在螺旋上。

如果主要考虑速度,Marsaglia和Tsang的Ziggurat算法是最快的算法之一,通过统计测试判断其质量很好。关于用于生成法线的主要技术以及头对头比较的详细讨论,请参阅本文。