# Simulating statistical error with FillRandom

Dear Rooters,

consider the following situation: there is a distribution F that describes my spectrum. I want to simulate how the spectrum will appear in the data (that means:I want to add the statistical error to the theoretical spectrum).

I try to do it manually, adding/subtracting to each bin content a random value from a Gaussian with mean 0 and sigma sqrt(N), where N are the counts of the bin (i.e. the bin content):

``````void test_1() {

Int_t nBins = 500;
Float_t xMin = 1.94;
Float_t xMax = 2.14;
Float_t BinW = (xMax-xMin)/nBins;

TF1 * f_MI = new TF1 ("f_MI","[0]*[1]/(2*TMath::Pi()*((x-[2])^2+[1]^2/4))",xMin,xMax);
f_MI->SetParameter(0,1.0);
f_MI->SetParameter(1,0.01);
f_MI->SetParameter(2,2.05);

TCanvas *c1 = new TCanvas ("c1","c1");
TH1F *h1 = new TH1F("H_with_statErr","H_with_statErr",nBins,xMin,xMax);

gRandom = new TRandom3();
Double_t r, sigma, x, y;

for (Int_t i=0;i<nBins;i++) {

x = i*BinW+xMin;
y = f_MI->Eval(x);

sigma = sqrt(y);
TF1 *fGaus = new TF1("fGaus","TMath::Gaus(0,[0])",0,5);
fGaus->SetParameter(0,sigma);
r = fGaus->GetRandom();
y = f_MI->Eval(x)+r;

h1->SetBinContent(i,y);
}

h1->Draw();
}``````

and with the method TH1F::FillRandom():

``````void test_2() {

Int_t nBins = 500;
Float_t xMin = 1.94;
Float_t xMax = 2.14;
Float_t BinW = (xMax-xMin)/nBins;

TF1 * f_MI = new TF1 ("f_MI","[0]*[1]/(2*TMath::Pi()*((x-[2])^2+[1]^2/4))",xMin,xMax);
f_MI->SetParameter(0,1.0);
f_MI->SetParameter(1,0.01);
f_MI->SetParameter(2,2.05);

TCanvas *c1 = new TCanvas ("c1","c1");
TH1F *h1 = new TH1F("H_FillRandom","H_FillRandom",nBins,xMin,xMax);
h1->FillRandom("f_MI",1000);
h1->Draw();
}``````

I would have expected the same results… but it is not the case.
Why? How does FillRandom work precisely?

Thanks

if I do:

h1->FillRandom(“f_MI”,10000);

I get something very similar.