如何在 class 中编写有效的正态分布
How to write an efficient normal distribution inside a class
我是 运行 我在相同情况下的项目(即当然除了随机数)。有时实验 运行 顺利,有时则不然。我怀疑随机生成器的实现方式。这是我使用标准 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;
}
}
我的第一个问题是我的方法有什么问题吗?如果是这样,在 class 中实现正态分布的最有效方法是什么?
Box-Muller(在评论中提到)是一种常见的方法,但与许多替代方法相比,它相对较慢,因为它依赖于先验函数(log、sin 和 cos)。它还有一个 well-known interaction with linear congruential generators, if those are the underlying source of uniforms, that causes pairs of values to fall on a spiral.
如果速度是主要问题,Ziggurat algorithm of Marsaglia and Tsang is one of the fastest and has excellent quality as judged by statistical tests. Please see this paper 可以很好地讨论用于生成法线的主要技术,并进行直接比较。
我是 运行 我在相同情况下的项目(即当然除了随机数)。有时实验 运行 顺利,有时则不然。我怀疑随机生成器的实现方式。这是我使用标准 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;
}
}
我的第一个问题是我的方法有什么问题吗?如果是这样,在 class 中实现正态分布的最有效方法是什么?
Box-Muller(在评论中提到)是一种常见的方法,但与许多替代方法相比,它相对较慢,因为它依赖于先验函数(log、sin 和 cos)。它还有一个 well-known interaction with linear congruential generators, if those are the underlying source of uniforms, that causes pairs of values to fall on a spiral.
如果速度是主要问题,Ziggurat algorithm of Marsaglia and Tsang is one of the fastest and has excellent quality as judged by statistical tests. Please see this paper 可以很好地讨论用于生成法线的主要技术,并进行直接比较。