Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / C++与正态分布

正态分布(Normal distribution)又名高斯分布(Gaussiandistribution)。若随机变量X服从一个数学期望为μ、方差为σ^2的高斯分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。我们通常所说的标准正态分布是μ = 0,σ = 1的正态分布。 从上图可以看出,当相差1个方差(σ), 满足要求的面积有68.27%.当相差2个方差(σ)时,满足要求的面积有95.45.当相差3个方差(σ)时,满足要求的面积有99.73%.满足标准正态分的曲线,可以查表来求得正态分布的幅度.(见文后所附表格)方差(Variance),是各个数据分别与其和的平均数之差的平方的和的平均数,用字母D表示。在概率论和数理统计中,方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。标准差(StandardDeviation),是离均差平方和平均后的方根,用σ表示。标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。测试代码:// NormalDistribution.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <windows.h>
#include <algorithm>
#define _USE_MATH_DEFINES
#include <math.h>
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<<nDataCnt<<endl;    // 计算1个正负标准差之间包含的数字个数
    nDataCnt = 0;
    for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
    {
        double dDeviate = dArrData[nIdx] - dAverageData;
        if (abs(dDeviate) <= dStandardDeviation)
        {
            nDataCnt++;
        }
    }
    cout<<nDataCnt<<endl;    // 计算2个正负标准差之间包含的数字个数
    nDataCnt = 0;
    for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
    {
        double dDeviate = dArrData[nIdx] - dAverageData;
        if (abs(dDeviate) <= 2*dStandardDeviation)
        {
            nDataCnt++;
        }
    }
    cout<<nDataCnt<<endl;    // 计算3个正负标准差之间包含的数字个数
    nDataCnt = 0;
    for (int nIdx = 0; nIdx < DATA_CNT; nIdx++)
    {
        double dDeviate = dArrData[nIdx] - dAverageData;
        if (abs(dDeviate) <= 3*dStandardDeviation)
        {
            nDataCnt++;
        }
    }
    cout<<nDataCnt<<endl;    return 0;
} (附)标准正态分布表φ( - x ) = 1 φ( x )           
x00.010.020.030.040.050.060.070.080.09
00.500 00.504 00.508 00.512 00.516 00.519 90.523 90.527 90.531 90.535 9
0.10.539 80.543 80.547 80.551 70.555 70.559 60.563 60.567 50.571 40.575 3
0.20.579 30.583 20.587 10.591 00.594 80.598 70.602 60.606 40.610 30.614 1
0.30.617 90.621 70.625 50.629 30.633 10.636 80.640 40.644 30.648 00.651 7
0.40.655 40.659 10.662 80.666 40.670 00.673 60.677 20.680 80.684 40.687 9
0.50.691 50.695 00.698 50.701 90.705 40.708 80.712 30.715 70.719 00.722 4
0.60.725 70.729 10.732 40.735 70.738 90.742 20.745 40.748 60.751 70.754 9
0.70.758 00.761 10.764 20.767 30.770 30.773 40.776 40.779 40.782 30.785 2
0.80.788 10.791 00.793 90.796 70.799 50.802 30.805 10.807 80.810 60.813 3
0.90.815 90.818 60.821 20.823 80.826 40.828 90.835 50.834 00.836 50.838 9
10.841 30.843 80.846 10.848 50.850 80.853 10.855 40.857 70.859 90.862 1
1.10.864 30.866 50.868 60.870 80.872 90.874 90.877 00.879 00.881 00.883 0
1.20.884 90.886 90.888 80.890 70.892 50.894 40.896 20.898 00.899 70.901 5
1.30.903 20.904 90.906 60.908 20.909 90.911 50.913 10.914 70.916 20.917 7
1.40.919 20.920 70.922 20.923 60.925 10.926 50.927 90.929 20.930 60.931 9
1.50.933 20.934 50.935 70.937 00.938 20.939 40.940 60.941 80.943 00.944 1
1.60.945 20.946 30.947 40.948 40.949 50.950 50.951 50.952 50.953 50.953 5
1.70.955 40.956 40.957 30.958 20.959 10.959 90.960 80.961 60.962 50.963 3
1.80.964 10.964 80.965 60.966 40.967 20.967 80.968 60.969 30.970 00.970 6
1.90.971 30.971 90.972 60.973 20.973 80.974 40.975 00.975 60.976 20.976 7
20.977 20.977 80.978 30.978 80.979 30.979 80.980 30.980 80.981 20.981 7
2.10.982 10.982 60.983 00.983 40.983 80.984 20.984 60.985 00.985 40.985 7
2.20.986 10.986 40.986 80.987 10.987 40.987 80.988 10.988 40.988 70.989 0
2.30.989 30.989 60.989 80.990 10.990 40.990 60.990 90.991 10.991 30.991 6
2.40.991 80.992 00.992 20.992 50.992 70.992 90.993 10.993 20.993 40.993 6
2.50.993 80.994 00.994 10.994 30.994 50.994 60.994 80.994 90.995 10.995 2
2.60.995 30.995 50.995 60.995 70.995 90.996 00.996 10.996 20.996 30.996 4
2.70.996 50.996 60.996 70.996 80.996 90.997 00.997 10.997 20.997 30.997 4
2.80.997 40.997 50.997 60.997 70.997 70.997 80.997 90.997 90.998 00.998 1
2.90.998 10.998 20.998 20.998 30.998 40.998 40.998 50.998 50.998 60.998 6
x00.10.20.30.40.50.60.70.80.9
30.998 70.999 00.999 30.999 50.999 70.999 80.999 80.999 90.999 91.000 0
 (附)正态分布概率表C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm将C语言梳理一下,分布在以下10个章节中:
  1. Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成长之路(十):其他高级议题
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-01/111616.htm