9 #ifndef ThePEG_RandomGenerator_H
10 #define ThePEG_RandomGenerator_H
13 #include "ThePEG/Config/ThePEG.h"
14 #include "ThePEG/Interface/Interfaced.h"
15 #include "gsl/gsl_rng.h"
71 virtual void setSeed(
long seed) = 0;
88 template <
typename Unit> Unit
rnd(Unit b) {
return b*
rnd(); }
94 template <
typename Unit>
95 Unit
rnd(Unit a, Unit b) {
return a +
rnd(b - a); }
103 for (
int i = 0; i < n; ++i ) ret[i] =
rnd();
135 int rndsign(
double p1,
double p2,
double p3);
141 int rnd2(
double p0,
double p1) {
149 int rnd3(
double p0,
double p1,
double p2) {
150 return 1 +
rndsign(p0, p1, p2);
157 int rnd4(
double p0,
double p1,
double p2,
double p3);
171 template <
typename Unit>
183 double r = sqrt(-2.0*log(
rnd()));
194 template <
typename Unit>
204 template <
typename Unit>
206 if ( gamma <= Unit() )
return mean;
216 template <
typename Unit>
217 Unit
rndBW(Unit mean, Unit gamma, Unit cut) {
218 if ( gamma <= Unit() || cut <= Unit() )
return mean;
219 return mean + 0.5*gamma*tan(
rnd(atan(-2.0*min(mean,cut)/gamma),
220 atan(2.0*cut/gamma)));
227 template <
typename Unit>
229 if ( gamma <= Unit() )
return mean;
230 return sqrt(sqr(mean) + mean*gamma*tan(
rnd(atan(-mean/gamma),
240 template <
typename Unit>
242 if ( gamma <= Unit() || cut <= Unit() )
return mean;
243 double minarg = cut > mean? -mean/gamma:
244 (sqr(mean - cut) - sqr(mean))/(gamma*mean);
245 double maxarg = (sqr(mean + cut) - sqr(mean))/(mean*gamma);
246 return sqrt(sqr(mean) + mean*gamma*tan(
rnd(atan(minarg), atan(maxarg))));
297 template <
typename OutputIterator>
299 while ( n-- ) *o++ =
rnd();
351 virtual void fill() = 0;
416 struct ClassTraits<RandomGenerator>:
417 public ClassTraitsBase<RandomGenerator> {
419 static string className() {
return "ThePEG::RandomGenerator";
424 throw std::logic_error(
"Tried to instantiate abstract class"
425 "'Pythis7::RandomGenerator'");