在仿真的时候,经常需要用到高斯分布的随机噪声数据,可以简单的使用C++11及以上版本的C++标准库实现。
轮子代码如下:
#include <iostream>
#include <random>
#include <vector>
using namespace std;
double caculate_sum(vector<double>& data);
double caculate_mean(vector<double>& data);
double caculate_stdev(vector<double>& data);
int main(void)
{
#if 1
// 每次生成的随机数不同
random_device rd;
mt19937 gen(rd());
#else
// 如果用这个默认的引擎,每次生成的随机序列是相同的。
default_random_engine gen;
#endif
// 设定均值和标准差
normal_distribution<double> normal(0.0, 100.0); //mu = 0.0, sigma = 1.0 (标准差)
vector<double> data;
for(int i = 0; i<200000; i++)
{
data.push_back(normal(gen));
//data.push_back(dis(gen));
//cout<<data.at(i)<<endl;
}
//测试 计算总和,均值和方差
cout<<"Size: "<<data.size()<<endl;
cout<<"Sum: "<<caculate_sum(data)<<endl;
cout<<"Mean: "<<caculate_mean(data)<<endl;
cout<<"Stdev: "<<caculate_stdev(data)<<endl;
return 0;
}
double caculate_sum(vector<double>& data)
{
return std::accumulate(std::begin(data),std::end(data),0.0);
}
double caculate_mean(vector<double>& data)
{
return caculate_sum(data)/(data.size()*1.0f);
}
double caculate_stdev(vector<double>& data)
{
double mean = caculate_mean(data);
double accum = 0.0;
for(int i = 0; i<data.size(); i++)
{
accum += (data.at(i)-mean)*(data.at(i)-mean);
}
return sqrt(accum/((data.size()-1)*1.0f));
}
运行结果如下: