如何能产生个高斯分布呢
怎么能产生个高斯分布呢?
不是一个图谱的那种,我是想要个累加形式的高斯分布,每次循环产生0~1024道的单道的计数,每次产生的单道计数n>=1;然后要求最后每道的累加和分布呈现是高斯函数形式的?
------解决方案--------------------
明白,这个有意思,试一下先!
------解决方案--------------------
不是一个图谱的那种,我是想要个累加形式的高斯分布,每次循环产生0~1024道的单道的计数,每次产生的单道计数n>=1;然后要求最后每道的累加和分布呈现是高斯函数形式的?
------解决方案--------------------
明白,这个有意思,试一下先!
------解决方案--------------------
- C/C++ code
#include <cmath> const double PI = 3.141592654; //圆周率 //分布方程 double CDrawLayoutDlg::Layout(double x) { if(!UpdateData()) return 0; double CONA = 1/( sqrt(2*PI)*m_fEditSigema ) ; double CONC = 2 * m_fEditSigema * m_fEditSigema; double rtn = CONA * exp(-pow(x-m_fEditMu,2)/CONC); return rtn; } //积分函数 double CDrawLayoutDlg::FintegralEx(double x1,double x2,double delta) { double rtn = 0; for (double n = x1;x2-n>(delta/2);n+=delta) { rtn += delta*Layout(n); } return rtn; } //范围包含查找,折半查找法 int CDrawLayoutDlg::FindHalf(int* pData,int iLen,int iFind) { if(iLen <= 1){ return (pData[0] <= iFind)?1:0; } if (pData[iLen/2 - 1] <= iFind && iFind< pData[iLen/2]){ return iLen/2; } else if(iFind < pData[iLen/2 - 1]){ return FindHalf(pData,iLen/2,iFind); } else{ return iLen/2 + FindHalf(pData + iLen/2,(iLen+1)/2,iFind); } } //主函数 void CDrawLayoutDlg::OnBtnDraw() { // TODO: Add your control notification handler code here if(!UpdateData()) return; //负无穷到正无穷积分,其实不是真的要算,只是验证一下积出来是否等于1 // -5 到 5 ,积出来是0.999999 double fTotalEx = FintegralEx(-5,5,0.001); double fDelta[1000]; //存放各个区间的几率 int i=0; double n; for (n = -5;n<5-0.01;n+=0.01,++i) //求各区间几率 { fDelta[i] = FintegralEx(n,n+0.01,0.001); } int iDeltaSpr[1000]; //存放各个区间的分隔数 double fOdds=0; for (i=0;i<1000;++i) //通过几率求分隔数 { fOdds+=fDelta[i]; iDeltaSpr[i] = int(RAND_MAX * fOdds); } int iRand; srand(time(0)); int iCount[1000]; //存放各个区间的出现次数 ZeroMemory(iCount,1000*4); for (i=0;i<m_iEditTestCnt;++i) //循环N次,得结果 { iRand = rand(); iCount[FindHalf(iDeltaSpr,1000,iRand)]++; } CRect rt; //显示结果 GetClientRect(rt); CClientDC dc(this); // double fScale=double(rt.Height())*0.8/ iCount[500]; //显示的比例 for (i=0;i<1000;++i) { dc.MoveTo(i,rt.Height() - 10); dc.LineTo(i,rt.Height() - 10-iCount[i]); //输出测试图,看最终结果 //dc.LineTo(i,rt.Height() - 10-fDelta[i]*20000); //输出几率图,看中间结果 } }