用C++、box-muller产生高斯分布的随机数

本文介绍如何使用Box-Muller公式生成符合正态分布的数据,并通过C++代码实现这一过程,同时提供了使用Python进行数据可视化的方法,强调了在数据处理中将字符串转换为浮点数的重要性。

box-muller公式很简单,而且非常强大!

不推导了,不证明了……

其中U1、U2是[0,1]的均匀分布的随机数,X是产生的符合N(0,1)正态分布的数。

想要得到符合任意期望和标准差的数,只需要

                                     Y= E+D*X

就可以了。

就是按照box-muller这个算是产生数据就可以了。就是C++的一些特性要适应一下。

我下方这些代码是生成数据然后存在一个文件里的。

为什么要这么做?因为我总得验证一下我生成的到底是不是符合高斯分布吧?

#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <fstream>
#define PI 3.14159
using namespace std;

//mu期望  sigma 标准差 HowMany  产生多少个
//box-muller 
void GetNumberToFile(int mu,int sigma,int HowMany){
	srand((unsigned)time(NULL));  //随机数种子采用系统时钟
	ofstream outfile("Data.txt",ios::out);
	for(int i=0;i<HowMany;i++){
		double x0=double(abs(rand()%100))/100;//产生0-1的随机数
		double x1=double(abs(rand()%100))/100;//产生0-1的随机数
		double t=sqrt(-2*log(x0))*sin(2*PI*x1);
        //出现inf或者nan都不算数,重新来。
		if(isinf(t)||isnan(t)) {
			i--;
			continue;
		}
		cout<<t<<endl;
		outfile<<mu+t*sigma<<endl;	
	}
}

上面生成完之后,我想用python的可视化工具来看。

这里有个坑!

你python读文件之后,读进去的是字符串!

是的是的,这么低级的错误你都犯??

只能说matplotlib兼容性太好了……

它字符串列表作为data都可以呀!

如果你只是把C++生成的那些数用字符串读进去,你得到的图是这样的:

你看x轴竟然是一团浆糊有没有!-_-||

我竟然一直以为是我生成的数不对!

额……

好了,实际上你要用python做数字可视化,一定记得把数字转换成float型!

正确的、可用的python:


import matplotlib.pyplot as plt
import math
from random import random

def Generate(mu,sigma):
	data=[]
	for i in range(100):
		data.append(mu+sigma*(math.sqrt(-2*math.log(random()))*math.sin(2*math.pi*random())))
	return data
if __name__=='__main__':
	with open(r'C:\Users\Lenovo\Desktop\Code_prec\1.txt','r') as f:
		data=[]
		for line in f:
			data.append(float(line.strip()))#就是这里我跪了!!!!
		plt.figure()
		plt.hist(data,bins=50)
		plt.show()
	exit(0)	
	

正常的图:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值