轮子——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));
}	

运行结果如下:
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值