175 TRandom::TRandom(UInt_t seed): TNamed(
"Random",
"Default Random number generator")
186 if (gRandom ==
this) gRandom = 0;
200 Int_t TRandom::Binomial(Int_t ntot, Double_t prob)
202 if (prob < 0 || prob > 1)
return 0;
204 for (Int_t i=0;i<ntot;i++) {
205 if (Rndm() > prob)
continue;
214 Double_t TRandom::BreitWigner(Double_t mean, Double_t gamma)
216 Double_t rval, displ;
218 displ = 0.5*gamma*TMath::Tan(rval*TMath::PiOver2());
228 void TRandom::Circle(Double_t &x, Double_t &y, Double_t r)
230 Double_t phi = Uniform(0,TMath::TwoPi());
231 x = r*TMath::Cos(phi);
232 y = r*TMath::Sin(phi);
240 Double_t TRandom::Exp(Double_t tau)
243 Double_t t = -tau * TMath::Log( x );
263 Double_t TRandom::Gaus(Double_t mean, Double_t sigma)
265 const Double_t kC1 = 1.448242853;
266 const Double_t kC2 = 3.307147487;
267 const Double_t kC3 = 1.46754004;
268 const Double_t kD1 = 1.036467755;
269 const Double_t kD2 = 5.295844968;
270 const Double_t kD3 = 3.631288474;
271 const Double_t kHm = 0.483941449;
272 const Double_t kZm = 0.107981933;
273 const Double_t kHp = 4.132731354;
274 const Double_t kZp = 18.52161694;
275 const Double_t kPhln = 0.4515827053;
276 const Double_t kHm1 = 0.516058551;
277 const Double_t kHp1 = 3.132731354;
278 const Double_t kHzm = 0.375959516;
279 const Double_t kHzmp = 0.591923442;
282 const Double_t kAs = 0.8853395638;
283 const Double_t kBs = 0.2452635696;
284 const Double_t kCs = 0.2770276848;
285 const Double_t kB = 0.5029324303;
286 const Double_t kX0 = 0.4571828819;
287 const Double_t kYm = 0.187308492 ;
288 const Double_t kS = 0.7270572718 ;
289 const Double_t kT = 0.03895759111;
298 result = kHp*y-kHp1;
break; }
302 result = (rn>0) ? (1+rn) : (-1+rn);
309 z = (rn>0) ? 2-rn : -2-rn;
310 if ((kC1-y)*(kC3+TMath::Abs(z))<kC2) {
314 if ((y+kD1)*(kD3+x)<kD2) {
315 result = rn;
break; }
316 else if (kHzmp-y<exp(-(z*z+kPhln)/2)) {
318 else if (y+kHzm<exp(-(x+kPhln)/2)) {
319 result = rn;
break; }
334 if ((y-kAs+x)*(kCs+x)+kBs<0) {
335 result = rn;
break; }
337 if (rn*rn<4*(kB-log(x))) {
338 result = rn;
break; }
342 return mean + sigma * result;
349 UInt_t TRandom::Integer(UInt_t imax)
352 ui = (UInt_t)(imax*Rndm());
369 Double_t TRandom::Landau(Double_t mu, Double_t sigma)
371 if (sigma <= 0)
return 0;
373 Double_t res = mu + ROOT::Math::landau_quantile(x, sigma);
391 Int_t TRandom::Poisson(Double_t mean)
394 if (mean <= 0)
return 0;
396 Double_t expmean = TMath::Exp(-mean);
402 if (pir <= expmean)
break;
407 else if (mean < 1E9) {
409 Double_t sq, alxm, g;
410 Double_t pi = TMath::Pi();
412 sq = TMath::Sqrt(2.0*mean);
413 alxm = TMath::Log(mean);
414 g = mean*alxm - TMath::LnGamma(mean + 1.0);
418 y = TMath::Tan(pi*Rndm());
422 em = TMath::Floor(em);
423 t = 0.9*(1.0 + y*y)* TMath::Exp(em*alxm - TMath::LnGamma(em + 1.0) - g);
424 }
while( Rndm() > t );
426 return static_cast<Int_t
> (em);
431 n = Int_t(Gaus(0,1)*TMath::Sqrt(mean) + mean +0.5);
443 Double_t TRandom::PoissonD(Double_t mean)
446 if (mean <= 0)
return 0;
448 Double_t expmean = TMath::Exp(-mean);
454 if (pir <= expmean)
break;
456 return static_cast<Double_t
>(n);
459 else if (mean < 1E9) {
461 Double_t sq, alxm, g;
462 Double_t pi = TMath::Pi();
464 sq = TMath::Sqrt(2.0*mean);
465 alxm = TMath::Log(mean);
466 g = mean*alxm - TMath::LnGamma(mean + 1.0);
470 y = TMath::Tan(pi*Rndm());
474 em = TMath::Floor(em);
475 t = 0.9*(1.0 + y*y)* TMath::Exp(em*alxm - TMath::LnGamma(em + 1.0) - g);
476 }
while( Rndm() > t );
482 return Gaus(0,1)*TMath::Sqrt(mean) + mean +0.5;
489 void TRandom::Rannor(Float_t &a, Float_t &b)
495 x = z * 6.28318530717958623;
496 r = TMath::Sqrt(-2*TMath::Log(y));
497 a = (Float_t)(r * TMath::Sin(x));
498 b = (Float_t)(r * TMath::Cos(x));
504 void TRandom::Rannor(Double_t &a, Double_t &b)
510 x = z * 6.28318530717958623;
511 r = TMath::Sqrt(-2*TMath::Log(y));
512 a = r * TMath::Sin(x);
513 b = r * TMath::Cos(x);
519 void TRandom::ReadRandom(
const char *filename)
521 if (!gDirectory)
return;
522 char *fntmp = gSystem->ExpandPathName(filename);
523 TDirectory *file = (TDirectory*)gROOT->ProcessLine(Form(
"TFile::Open(\"%s\");",fntmp));
525 if(file && file->GetFile()) {
526 gDirectory->ReadTObject(
this,GetName());
541 Double_t TRandom::Rndm( )
543 #ifdef OLD_TRANDOM_IMPL
544 const Double_t kCONS = 4.6566128730774E-10;
545 const Int_t kMASK24 = 2147483392;
548 UInt_t jy = (fSeed&kMASK24);
549 if (jy)
return kCONS*jy;
554 const Double_t kCONS = 4.6566128730774E-10;
555 fSeed = (1103515245 * fSeed + 12345) & 0x7fffffffUL;
557 if (fSeed)
return kCONS*fSeed;
564 void TRandom::RndmArray(Int_t n, Double_t *array)
566 const Double_t kCONS = 4.6566128730774E-10;
569 fSeed = (1103515245 * fSeed + 12345) & 0x7fffffffUL;
570 if (fSeed) {array[i] = kCONS*fSeed; i++;}
577 void TRandom::RndmArray(Int_t n, Float_t *array)
579 const Double_t kCONS = 4.6566128730774E-10;
582 fSeed = (1103515245 * fSeed + 12345) & 0x7fffffffUL;
583 if (fSeed) {array[i] = Float_t(kCONS*fSeed); i++;}
597 void TRandom::SetSeed(ULong_t seed)
603 fSeed = UInt_t(uuid[3])*16777216 + UInt_t(uuid[2])*65536 + UInt_t(uuid[1])*256 + UInt_t(uuid[0]);
617 void TRandom::Sphere(Double_t &x, Double_t &y, Double_t &z, Double_t r)
619 Double_t a=0,b=0,r2=1;
625 z = r* ( -1. + 8.0 * r2 );
627 Double_t scale = 8.0 * r * TMath::Sqrt(0.25 - r2);
635 Double_t TRandom::Uniform(Double_t x1)
637 Double_t ans = Rndm();
644 Double_t TRandom::Uniform(Double_t x1, Double_t x2)
646 Double_t ans= Rndm();
647 return x1 + (x2-x1)*ans;
653 void TRandom::WriteRandom(
const char *filename)
const
655 if (!gDirectory)
return;
656 char *fntmp = gSystem->ExpandPathName(filename);
657 TDirectory *file = (TDirectory*)gROOT->ProcessLine(Form(
"TFile::Open(\"%s\",\"recreate\");",fntmp));
659 if(file && file->GetFile()) {
660 gDirectory->WriteTObject(
this,GetName());