27 Int_t RandomFunctionsImpl<TRandomEngine>::Binomial(Int_t ntot, Double_t prob)
29 if (prob < 0 || prob > 1)
return 0;
31 for (Int_t i=0;i<ntot;i++) {
32 if (Rndm() > prob)
continue;
41 Double_t RandomFunctionsImpl<TRandomEngine>::BreitWigner(Double_t mean, Double_t gamma)
45 displ = 0.5*gamma*TMath::Tan(rval*TMath::PiOver2());
55 void RandomFunctionsImpl<TRandomEngine>::Circle(Double_t &x, Double_t &y, Double_t r)
57 Double_t phi = Uniform(0,TMath::TwoPi());
58 x = r*TMath::Cos(phi);
59 y = r*TMath::Sin(phi);
67 Double_t RandomFunctionsImpl<TRandomEngine>::Exp(Double_t tau)
70 Double_t t = -tau * TMath::Log( x );
77 double RandomFunctionsImpl<TRandomEngine>::GausBM(
double mean,
double sigma) {
80 double x = z * 6.28318530717958623;
81 double radius = std::sqrt(-2*std::log(y));
82 double g = radius * std::sin(x);
83 return mean + g * sigma;
96 double RandomFunctionsImpl<TRandomEngine>::GausACR(Double_t mean, Double_t sigma)
98 const Double_t kC1 = 1.448242853;
99 const Double_t kC2 = 3.307147487;
100 const Double_t kC3 = 1.46754004;
101 const Double_t kD1 = 1.036467755;
102 const Double_t kD2 = 5.295844968;
103 const Double_t kD3 = 3.631288474;
104 const Double_t kHm = 0.483941449;
105 const Double_t kZm = 0.107981933;
106 const Double_t kHp = 4.132731354;
107 const Double_t kZp = 18.52161694;
108 const Double_t kPhln = 0.4515827053;
109 const Double_t kHm1 = 0.516058551;
110 const Double_t kHp1 = 3.132731354;
111 const Double_t kHzm = 0.375959516;
112 const Double_t kHzmp = 0.591923442;
115 const Double_t kAs = 0.8853395638;
116 const Double_t kBs = 0.2452635696;
117 const Double_t kCs = 0.2770276848;
118 const Double_t kB = 0.5029324303;
119 const Double_t kX0 = 0.4571828819;
120 const Double_t kYm = 0.187308492 ;
121 const Double_t kS = 0.7270572718 ;
122 const Double_t kT = 0.03895759111;
131 result = kHp*y-kHp1;
break; }
135 result = (rn>0) ? (1+rn) : (-1+rn);
142 z = (rn>0) ? 2-rn : -2-rn;
143 if ((kC1-y)*(kC3+TMath::Abs(z))<kC2) {
147 if ((y+kD1)*(kD3+x)<kD2) {
148 result = rn;
break; }
149 else if (kHzmp-y<exp(-(z*z+kPhln)/2)) {
151 else if (y+kHzm<exp(-(x+kPhln)/2)) {
152 result = rn;
break; }
167 if ((y-kAs+x)*(kCs+x)+kBs<0) {
168 result = rn;
break; }
170 if (rn*rn<4*(kB-log(x))) {
171 result = rn;
break; }
175 return mean + sigma * result;
191 Double_t RandomFunctionsImpl<TRandomEngine>::Landau(Double_t mu, Double_t sigma)
193 if (sigma <= 0)
return 0;
195 Double_t res = mu + ROOT::Math::landau_quantile(x, sigma);
213 Int_t RandomFunctionsImpl<TRandomEngine>::Poisson(Double_t mean)
216 if (mean <= 0)
return 0;
218 Double_t expmean = TMath::Exp(-mean);
224 if (pir <= expmean)
break;
229 else if (mean < 1E9) {
231 Double_t sq, alxm, g;
232 Double_t pi = TMath::Pi();
234 sq = TMath::Sqrt(2.0*mean);
235 alxm = TMath::Log(mean);
236 g = mean*alxm - TMath::LnGamma(mean + 1.0);
240 y = TMath::Tan(pi*Rndm());
244 em = TMath::Floor(em);
245 t = 0.9*(1.0 + y*y)* TMath::Exp(em*alxm - TMath::LnGamma(em + 1.0) - g);
246 }
while( Rndm() > t );
248 return static_cast<Int_t
> (em);
253 n = Int_t(Gaus(0,1)*TMath::Sqrt(mean) + mean +0.5);
265 Double_t RandomFunctionsImpl<TRandomEngine>::PoissonD(Double_t mean)
268 if (mean <= 0)
return 0;
270 Double_t expmean = TMath::Exp(-mean);
276 if (pir <= expmean)
break;
278 return static_cast<Double_t
>(n);
281 else if (mean < 1E9) {
283 Double_t sq, alxm, g;
284 Double_t pi = TMath::Pi();
286 sq = TMath::Sqrt(2.0*mean);
287 alxm = TMath::Log(mean);
288 g = mean*alxm - TMath::LnGamma(mean + 1.0);
292 y = TMath::Tan(pi*Rndm());
296 em = TMath::Floor(em);
297 t = 0.9*(1.0 + y*y)* TMath::Exp(em*alxm - TMath::LnGamma(em + 1.0) - g);
298 }
while( Rndm() > t );
304 return Gaus(0,1)*TMath::Sqrt(mean) + mean +0.5;
312 void RandomFunctionsImpl<TRandomEngine>::Rannor(Double_t &a, Double_t &b)
318 x = z * 6.28318530717958623;
319 r = TMath::Sqrt(-2*TMath::Log(y));
320 a = r * TMath::Sin(x);
321 b = r * TMath::Cos(x);
332 void RandomFunctionsImpl<TRandomEngine>::Sphere(Double_t &x, Double_t &y, Double_t &z, Double_t r)
334 Double_t a=0,b=0,r2=1;
340 z = r* ( -1. + 8.0 * r2 );
342 Double_t scale = 8.0 * r * TMath::Sqrt(0.25 - r2);
350 Double_t RandomFunctionsImpl<TRandomEngine>::Uniform(Double_t x1)
352 Double_t ans = Rndm();
359 double RandomFunctionsImpl<TRandomEngine>::Uniform(
double a,
double b) {
360 return (b-a) * Rndm() + a;