17 #ifndef ROOT_Math_RandomFunctions
18 #define ROOT_Math_RandomFunctions
21 #include <type_traits>
47 typedef TRandomEngine DefaultEngineType;
56 template <
class EngineBaseType>
57 class RandomFunctionsImpl {
59 void SetEngine(
void *) {}
69 class RandomFunctionsImpl<TRandomEngine> {
74 RandomFunctionsImpl() : fBaseEngine(0) {}
76 void SetEngine(
void *r) {
77 fBaseEngine =
static_cast<TRandomEngine*
>(r);
83 int Binomial(
int ntot,
double prob);
86 double BreitWigner(
double mean,
double gamma);
91 void Circle(
double &x,
double &y,
double r);
95 double Exp(
double tau);
98 double GausBM(
double mean,
double sigma);
101 double GausACR(
double mean,
double sigma);
106 double Landau(
double mu,
double sigma);
110 int Poisson(
double mean);
111 double PoissonD(
double mean);
115 void Rannor(
double &a,
double &b);
119 void Sphere(
double &x,
double &y,
double &z,
double r);
122 double Uniform(
double a,
double b);
123 double Uniform(
double a);
126 TRandomEngine* fBaseEngine;
130 double Rndm() {
return fBaseEngine->Rndm(); }
132 double Gaus(
double mean,
double sigma) {
return GausACR(mean,sigma); }
138 template <
class Engine,
class EngineBaseType>
139 class RandomFunctions {
146 RandomFunctions(Engine & rng) : fEngine(&rng) {
147 fImpl.SetEngine(&rng);
151 ~RandomFunctions() {}
155 inline double operator() () {
return (*fEngine)(); }
159 int Binomial(
int ntot,
double prob) {
160 return fImpl.Binomial(ntot,prob);
164 double BreitWigner(
double mean,
double gamma) {
165 return fImpl.BreitWigner(mean,gamma);
171 void Circle(
double &x,
double &y,
double r) {
172 return fImpl.Circle(x,y,r);
177 double Exp(
double tau) {
178 return fImpl.Exp(tau);
182 double GausBM(
double mean,
double sigma) {
183 return fImpl.GausBM(mean,sigma);
187 double GausACR(
double mean,
double sigma) {
188 return fImpl.GausACR(mean, sigma);
194 double Landau(
double mu,
double sigma) {
195 return fImpl.Landau(mu,sigma);
200 int Poisson(
double mean) {
return fImpl.Poisson(mean); }
201 double PoissonD(
double mean) {
return fImpl.PoissonD(mean); }
205 void Rannor(
double &a,
double &b) {
206 return fImpl.Rannor(a,b);
211 void Sphere(
double &x,
double &y,
double &z,
double r) {
212 return fImpl.Sphere(x,y,z,r);
216 double Uniform(
double a,
double b) {
217 return (b-a) * Rndm_impl() + a;
221 double Uniform(
double a) {
222 return a * Rndm_impl() ;
227 inline double Gaus(
double mean,
double sigma) {
228 return fImpl.GausACR(mean,sigma);
247 double Gamma(
double ,
double ) {
249 static_assert(std::is_fundamental<Engine>::value,
"Error: Gamma() requires a GSL Engine type");
252 double Beta(
double ,
double ) {
253 static_assert(std::is_fundamental<Engine>::value,
"Error: Beta() requires a GSL Engine type");
256 double LogNormal(
double,
double) {
257 static_assert(std::is_fundamental<Engine>::value,
"Error: LogNormal() requires a GSL Engine type");
260 double ChiSquare(
double) {
261 static_assert(std::is_fundamental<Engine>::value,
"Error: ChiSquare() requires a GSL Engine type");
264 double Rayleigh(
double ) {
265 static_assert(std::is_fundamental<Engine>::value,
"Error: Rayleigh() requires a GSL Engine type");
268 double Logistic(
double ) {
269 static_assert(std::is_fundamental<Engine>::value,
"Error: Logistic() requires a GSL Engine type");
272 double Pareto(
double ,
double ) {
273 static_assert(std::is_fundamental<Engine>::value,
"Error: Pareto() requires a GSL Engine type");
276 double FDist(
double,
double) {
277 static_assert(std::is_fundamental<Engine>::value,
"Error: FDist() requires a GSL Engine type");
280 double tDist(
double) {
281 static_assert(std::is_fundamental<Engine>::value,
"Error: tDist() requires a GSL Engine type");
284 unsigned int NegativeBinomial(
double ,
double ) {
285 static_assert(std::is_fundamental<Engine>::value,
"Error: NegativeBinomial() requires a GSL Engine type");
288 std::vector<unsigned int> MultiNomial(
unsigned int,
const std::vector<double> &){
289 static_assert(std::is_fundamental<Engine>::value,
"Error: MultiNomial() requires a GSL Engine type");
290 return std::vector<unsigned int>();
296 Engine & Rng() { assert(fEngine);
return *fEngine; }
300 inline double Rndm_impl() {
return (*fEngine)(); }
306 RandomFunctionsImpl<EngineBaseType> fImpl;