设为首页 加入收藏

TOP

C++与正态分布
2015-02-02 14:15:53 来源: 作者: 【 】 浏览:4
Tags:分布



?



从上图可以看出,当相差1个方差(σ),?满足要求的面积有68.27%.


当相差2个方差(σ)时,满足要求的面积有95.45.


当相差3个方差(σ)时,满足要求的面积有99.73%.


满足标准正态分的曲线,可以查表来求得正态分布的幅度.(见文后所附表格)


方差(Variance),是各个数据分别与其和的平均数之差的平方的和的平均数,用字母D表示。在概率论和数理统计中,方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。


标准差(StandardDeviation),是离均差平方和平均后的方根,用σ表示。标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。


测试代码:


// NormalDistribution.cpp : Defines the entry point for the console application.
//
#include
#include
#include
#include
#include
#define _USE_MATH_DEFINES
#include
using namespace std;



// 高斯分布随机数系列,默认期望值为0,方差为1
double GaussRand(double dExpect = 0, double dVariance = 1);
double GaussRand(double dExpect, double dVariance)
{
? ? static double V1, V2, S;
? ? static int phase = 0;
? ? double X;


? ? if ( phase == 0 )
? ? {
? ? ? ? do
? ? ? ? {
? ? ? ? ? ? double U1 = (double)rand() / RAND_MAX;
? ? ? ? ? ? double U2 = (double)rand() / RAND_MAX;


? ? ? ? ? ? V1 = 2 * U1 - 1;
? ? ? ? ? ? V2 = 2 * U2 - 1;
? ? ? ? ? ? S = V1 * V1 + V2 * V2;
? ? ? ? } while(S >= 1 || S == 0);


? ? ? ? X = V1 * sqrt(-2 * log(S) / S);
? ? }
? ? else
? ? {
? ? ? ? X = V2 * sqrt(-2 * log(S) / S);
? ? }


? ? phase = 1 - phase;


? ? return (X*dVariance + dExpect);
}


int _tmain(int argc, _TCHAR* argv[])
{
? ? const int DATA_CNT = 100000;
? ? double dArrData[DATA_CNT] = {0};


? ? double dSum = 0;


? ? // 对所有数赋随机数,默认期望值为0,方差为1
? ? srand(GetTickCount());
? ? for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
? ? {
? ? ? ? // 防止计算方差时数值过大
? ? ? ? dArrData[nIdx] = GaussRand();
? ? ? ? dSum += dArrData[nIdx];
? ? }


? ? // 求平均数
? ? double dAverageData = dSum / DATA_CNT;


? ? // 计算所有的数的方差(各个数据分别与其和的平均数之差的平方的和的平均数)
? ? double dVariance = 0.0;
? ? for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
? ? {
? ? ? ? double dDeviate = dArrData[nIdx] - dAverageData;
? ? ? ? dVariance += pow(dDeviate, 2);
? ? }
? ? dVariance /= DATA_CNT;


? ? // 计算标准差(方差的算术平方根,反映一组数据的离散程序)
? ? double dStandardDeviation = sqrt(dVariance);


? ? // 计算0.5个正负标准差之间包含的数字个数
? ? int nDataCnt = 0;
? ? for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
? ? {
? ? ? ? double dDeviate = dArrData[nIdx] - dAverageData;
? ? ? ? if (abs(dDeviate) <= 0.5*dStandardDeviation)
? ? ? ? {
? ? ? ? ? ? nDataCnt++;
? ? ? ? }
? ? }
? ? cout<

? ? // 计算1个正负标准差之间包含的数字个数
? ? nDataCnt = 0;
? ? for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
? ? {
? ? ? ? double dDeviate = dArrData[nIdx] - dAverageData;
? ? ? ? if (abs(dDeviate) <= dStandardDeviation)
? ? ? ? {
? ? ? ? ? ? nDataCnt++;
? ? ? ? }
? ? }
? ? cout<

? ? // 计算2个正负标准差之间包含的数字个数
? ? nDataCnt = 0;
? ? for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
? ? {
? ? ? ? double dDeviate = dArrData[nIdx] - dAverageData;
? ? ? ? if (abs(dDeviate) <= 2*dStandardDeviation)
? ? ? ? {
? ? ? ? ? ? nDataCnt++;
? ? ? ? }
? ? }
? ? cout<

? ? // 计算3个正负标准差之间包含的数字个数
? ? nDataCnt = 0;
? ? for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
? ? {
? ? ? ? double dDeviate = dArrData[nIdx] - dAverageData;
? ? ? ? if (abs(dDeviate) <= 3*dStandardDeviation)
? ? ? ? {
? ? ? ? ? ? nDataCnt++;
? ? ? ? }
? ? }
? ? cout<

? ? return 0;
}



?


(附)标准正态分布表


φ( -?x?) = 1?φ(?x?)


? ? ? ? ? ?


?


(附)正态分布概率表





C语言梳理一下,分布在以下10个章节中:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C/C++的参数传递机制 下一篇一个二叉树是否包含另一个二叉树

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: