在仿真的時候,經常需要用到高斯分佈的隨機噪聲數據,可以簡單的使用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));
}
運行結果如下: