验证中心极限定理

各种随机分布抽名样函数

In [1]:
TRandom3 *randomx = new TRandom3();
randomx->SetSeed(0);
cout<<randomx->Rndm()<<'\t'<<randomx->Rndm()<<'\t'<<randomx->Rndm();
0.550109	0.0232898	0.513004
  • Rndm为0~1随机均匀抽样。

Uniform

In [2]:
TCanvas x;
TH1F *Unirndm = new TH1F("Unirndm","Unirndm",100,0,100);
for(Int_t i=0;i<10000;i++)
{
    Unirndm->Fill(randomx->Uniform(0,100));//Uniform(x,y):x~y之间均匀抽样;
}
Unirndm->Draw();
Unirndm->SetMinimum(0);
x.Draw();

Guass

In [3]:
x.Clear();
TH1F *gaurndm=new TH1F("gaurndm","gaurndm",100,0,100);
for(int i=0;i<10000;i++)
{
    gaurndm->Fill(randomx->Gaus(40,10));//Gawu(x,y):Mean:x;SIgma:y的高斯分布;注意是sigma,不是半高宽;
}
gaurndm->Draw();
gaurndm->SetMinimum(0);
x.Draw();

Binomial(二项分布)

In [4]:
x.Clear();
TH1F *binorndm=new TH1F("binorndm","binorndm",20,0,20);
for(int i=0;i<10000;i++)
{
    binorndm->Fill(randomx->Binomial(100,0.03));//Binomial(x,y):y为概率,x为mean/y,即mean=xy;
}
binorndm->Draw();
binorndm->SetMinimum(0);
x.Draw();

Exponential(指数分布)

In [5]:
x.Clear();
TH1F *exprndm=new TH1F("exprndm","exprndm",100,0,100);
for(int i=0;i<10000;i++)
{
    exprndm->Fill(randomx->Exp(10));
}
exprndm->Draw();
//exprndm->SetMinimum(0);
gPad->SetLogy();
x.Draw();

Check CLT by Exp

In [6]:
x.Clear();
    TH1F *expdist=new TH1F("expdist","expdist",100,0,100);
    TH1F *sum2=new TH1F("sum2","sum 1~2",4000,0,4000);
    TH1F *sum5=new TH1F("sum5","sum 1~5",4000,0,4000);
    TH1F *sum10=new TH1F("sum10","sum 1~10",4000,0,4000);
    TH1F *sum20=new TH1F("sum20","sum 1~20",4000,0,4000);
    TH1F *sum100=new TH1F("sum100","sum 1~100",4000,0,4000);
    //sum2->SetLineColor(kBlack);
    //sum5->SetLineColor(kGreen);
    //sum10->SetLineColor(kBlue);
    //sum20->SetLineColor(kRed);
    //sum100->SetLineColor(kBlack);
    TRandom3 *rndmx=new TRandom3();
    for(int i=0;i<100000;i++)
    {
        double rx=0;
        expdist->Fill(rndmx->Exp(10));
        for(int j=0;j<100;j++)
        {
            rx=rx+rndmx->Exp(10);
            if(j==1) sum2->Fill(rx*50);
            if(j==4) sum5->Fill(rx*20);
            if(j==9) sum10->Fill(rx*10);
            if(j==19) sum20->Fill(rx*5);
            if(j==99) sum100->Fill(rx*1);
        }
    }

expdist

In [7]:
x.Clear();
expdist->Draw();
x.Draw();

SUM 1~2

In [8]:
x.Clear();
gPad->SetLogy(0);
sum2->Draw();
x.Draw();

SUM 1~5

In [9]:
x.Clear();
gPad->SetLogy(0);
sum5->Draw();
x.Draw();

SUM 1~10

In [10]:
x.Clear();
gPad->SetLogy(0);
sum10->Draw();
x.Draw();

SUM 1~20

In [11]:
x.Clear();
gPad->SetLogy(0);
sum20->Draw();
x.Draw();

SUM 1~100

In [12]:
x.Clear();
gPad->SetLogy(0);
sum100->Draw();
x.Draw();

Check CLT by Landau

In [13]:
x.Clear();
    TH1F *Landaudist=new TH1F("Landaudist","Landaudist",200,0,50);
    TH1F *sum2_1=new TH1F("sum2_1","sum 1~2",4000,0,4000);
    TH1F *sum5_1=new TH1F("sum5_1","sum 1~5",4000,0,4000);
    TH1F *sum10_1=new TH1F("sum10_1","sum 1~10",4000,0,4000);
    TH1F *sum20_1=new TH1F("sum20_1","sum 1~20",4000,0,4000);
    TH1F *sum100_1=new TH1F("sum100_1","sum 1~100",4000,0,4000);
   // sum2_1->SetLineColor(kBlack);
    //sum5_1->SetLineColor(kGreen);
    //sum10_1->SetLineColor(kBlue);
    //sum20_1->SetLineColor(kRed);
    //sum100_1->SetLineColor(kBlack);
    TRandom3 *rndmx1=new TRandom3();
    for(int i=0;i<100000;i++)
    {
        double rx=0;
        Landaudist->Fill(rndmx1->Landau(10,1));//Landau(x,y):mean:x;sigma:y;
        for(int j=0;j<100;j++)
        {
            double x=rndmx1->Landau(10,1);
           // while(x>50) x=rndmx1->Landau(10,1);
            rx=rx+x;
            if(j==1) sum2_1->Fill(rx*50);
            if(j==4) sum5_1->Fill(rx*20);
            if(j==9) sum10_1->Fill(rx*10);
            if(j==19) sum20_1->Fill(rx*5);
            if(j==99) sum100_1->Fill(rx*1);
        }
    }

Landau Distribution

In [14]:
%jsroot on
x.Clear();
Landaudist->Draw();
gPad->SetLogy(0);
x.Draw();
In [15]:
%jsroot on
x.Clear();
    sum2_1->SetLineColor(kBlack);
    sum5_1->SetLineColor(kGreen);
    sum10_1->SetLineColor(kBlue);
    sum20_1->SetLineColor(kRed);
    sum100_1->SetLineColor(kBlack);
gPad->SetLogy(0);
sum2_1->Draw();
sum5_1->Draw("same");
sum10_1->Draw("same");
sum20_1->Draw("same");
sum100_1->Draw("same");
x.Draw();

Check CLT by Landau with cutoff

In [16]:
%jsroot on   
    //TH1F *Landaudist=new TH1F("Landaudist","Landaudist",200,0,50);
    TH1F *sum2_2=new TH1F("sum2_2","sum 1~2",4000,0,4000);
    TH1F *sum5_2=new TH1F("sum5_2","sum 1~5",4000,0,4000);
    TH1F *sum10_2=new TH1F("sum10_2","sum 1~10",4000,0,4000);
    TH1F *sum20_2=new TH1F("sum20_2","sum 1~20",4000,0,4000);
    TH1F *sum100_2=new TH1F("sum100_2","sum 1~100",4000,0,4000);
    sum2_2->SetLineColor(kBlack);
    sum5_2->SetLineColor(kGreen);
    sum10_2->SetLineColor(kBlue);
    sum20_2->SetLineColor(kRed);
    sum100_2->SetLineColor(kBlack);
    TRandom3 *rndmx2=new TRandom3();
    for(int i=0;i<100000;i++)
    {
        double rx=0;
        Landaudist->Fill(rndmx2->Landau(10,1));//Landau(x,y):mean:x;sigma:y;
        for(int j=0;j<100;j++)
        {
            double x=rndmx2->Landau(10,1);
            while(x>50) x=rndmx2->Landau(10,1);
            rx=rx+x;
            if(j==1) sum2_2->Fill(rx*50);
            if(j==4) sum5_2->Fill(rx*20);
            if(j==9) sum10_2->Fill(rx*10);
            if(j==19) sum20_2->Fill(rx*5);
            if(j==99) sum100_2->Fill(rx*1);
        }
    }
x.Clear();
    sum2_1->SetLineColor(kBlack);
    sum5_1->SetLineColor(kGreen);
    sum10_1->SetLineColor(kBlue);
    sum20_1->SetLineColor(kRed);
    sum100_1->SetLineColor(kBlack);
gPad->SetLogy(0);
sum2_2->Draw();
sum2_2->GetYaxis()->SetRangeUser(0,800);
sum5_2->Draw("same");
sum10_2->Draw("same");
sum20_2->Draw("same");
sum100_2->Draw("same");
x.Draw();

总结: 朗道分布的拖尾会影响对中心极限定理的验证;因为中心极限定理的前提是元素分布要有有限的均值和方差;

In [17]:
!jupyter nbconvert checkCLT.ipynb --to html
[NbConvertApp] Converting notebook checkCLT.ipynb to html

[NbConvertApp] Writing 881221 bytes to checkCLT.html