輪子——C++高斯分佈隨機數生成

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

運行結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章