如何在类中编写一个有效的正态分布
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;
}
}
我的第一个问题是我的方法有什么问题吗?如果是这样,在类中实现正态分布的最有效方法是什么?
Box-Muller(在评论中提到)是一种常见的方法,但与许多替代方法相比,它相对较慢,因为它依赖于超越函数(log, sin和cos)。它还与线性同余发生器有一个众所周知的相互作用,如果这些是统一的潜在来源,则会导致成对的值落在螺旋上。
如果主要考虑速度,Marsaglia和Tsang的Ziggurat算法是最快的算法之一,通过统计测试判断其质量很好。关于用于生成法线的主要技术以及头对头比较的详细讨论,请参阅本文。
相关文章:
- void() 是一个有效的C++表达式吗?
- C++14 : 2 个随机生成器 - 一个有效,另一个无效
- 使用 CMake 与其他静态库链接的静态库 - 一个有效,一个无效。为什么?
- 一个有效的图算法,满足以下条件
- 将一个数字拆分为多个数字,每个数字只有一个有效位
- 这是一个有效的单例类吗?
- C++,我正在尝试创建一个有效的.bmp输出文件
- 尝试获取用户输入和cout消息期望,当我输入一个有效名称时,它将所有这些命名
- 如何说一个有效或无效,即使一个是,另一个不是
- 模板中的方法:一个有效,一个不实例化
- 如何确保迷宫总是有一个有效的路径C++
- 这是一个有效的编译器优化吗
- 如何删除C++中浮点数的最后一个有效数字/尾数位
- 在给定平方矩阵的子矩阵中找到一个有效的算法来回答查询
- 我们可以检查一个指针以确保它是一个有效的地址吗
- 这是一个有效的生成文件吗?
- 指针和类有问题。两个相同的类,其中一个有效,一个无效
- dynamic_cast不能保证一个有效、完整的对象?
- 选择一个有效的数据结构来寻找韵律
- 将引用分配给引用是一个有效的操作