

?

从上图可以看出,当相差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个章节中: