#include <time.h>
#include <cassert>
#include "gsl/gsl_rng.h"
#include "gsl/gsl_randist.h"
#include "Math/GSLRndmEngines.h"
extern double gsl_ran_gaussian_acr(  const gsl_rng * r, const double sigma);
namespace ROOT {
namespace Math {
  
  class GSLRng { 
    public:
    GSLRng() : 
      fRng(0),
      fRngType(0) 
    {
    }
    GSLRng(const gsl_rng_type * type) : 
      fRng(0),
      fRngType(type) 
    {
    }
    ~GSLRng() {   } 
    void Allocate() { 
      if (fRngType == 0) SetDefaultType();
      fRng = gsl_rng_alloc( fRngType );
      
    }
    void Free() { 
      
      if (fRng != 0) gsl_rng_free(fRng);       
      fRng = 0; 
    }
    void SetType(const gsl_rng_type * type) { 
      fRngType = type; 
    }
    void SetDefaultType() { 
      
      gsl_rng_env_setup(); 
      fRngType =  gsl_rng_default; 
    }
    inline gsl_rng * Rng() const { return fRng; } 
  private: 
    gsl_rng * fRng; 
    const gsl_rng_type * fRngType; 
  };
  
  GSLRandomEngine::GSLRandomEngine() : 
    fCurTime(0)
  {  
    fRng = new GSLRng();
  } 
  GSLRandomEngine::~GSLRandomEngine() { 
    
  }
  void GSLRandomEngine::Initialize() { 
  
    assert(fRng != 0);
    fRng->Allocate(); 
  }
  void GSLRandomEngine::Terminate() { 
  
    assert(fRng != 0);
    fRng->Free();
    delete fRng; 
    fRng = 0; 
  }
  double GSLRandomEngine::operator() () { 
    
    
    return gsl_rng_uniform_pos(fRng->Rng() ); 
  }
  void GSLRandomEngine::RandomArray(double * begin, double * end )  { 
    
    
      for ( double * itr = begin; itr != end; ++itr ) { 
	*itr = gsl_rng_uniform_pos(fRng->Rng() ); 
      }
  }
  void GSLRandomEngine::SetSeed(unsigned int seed) { 
  
  
  
    if (seed == 0) { 
      
      time_t curtime;  
      time(&curtime); 
      unsigned int ct = static_cast<unsigned int>(curtime);
      if (ct != fCurTime) { 
	fCurTime = ct; 
	
	std::srand(ct); 
      }
      seed = std::rand();
    } 
    assert(fRng);
    gsl_rng_set(fRng->Rng(), seed ); 
  }
  std::string GSLRandomEngine::Name() const { 
  
    assert ( fRng != 0); 
    assert ( fRng->Rng() != 0 ); 
    return std::string( gsl_rng_name( fRng->Rng() ) ); 
  }
  unsigned int GSLRandomEngine::Size() const { 
  
     assert (fRng != 0);
     return gsl_rng_size( fRng->Rng() ); 
  }
  
  
  double GSLRandomEngine::GaussianZig(double sigma)  
  {
    
     return gsl_ran_gaussian_ziggurat(  fRng->Rng(), sigma);
  }
  double GSLRandomEngine::Gaussian(double sigma)  
  {
    
     return gsl_ran_gaussian(  fRng->Rng(), sigma);
  }
  double GSLRandomEngine::GaussianRatio(double sigma)  
  {
    
     return gsl_ran_gaussian_ratio_method(  fRng->Rng(), sigma);
  }
  double GSLRandomEngine::GaussianTail(double a , double sigma) 
  {
     
     
     return gsl_ran_gaussian_tail(  fRng->Rng(), a, sigma);
  }
  void GSLRandomEngine::Gaussian2D(double sigmaX, double sigmaY, double rho, double &x, double &y) 
  { 
     
     gsl_ran_bivariate_gaussian(  fRng->Rng(), sigmaX, sigmaY, rho, &x, &y);
  }
  
  double GSLRandomEngine::Exponential(double mu)  
  {
     
     return gsl_ran_exponential(  fRng->Rng(), mu);
  }
  double GSLRandomEngine::Cauchy(double a) 
  {
    
    return gsl_ran_cauchy(  fRng->Rng(), a);
  }
  double GSLRandomEngine::Landau() 
  {
    
    return gsl_ran_landau(  fRng->Rng());
  }
  double GSLRandomEngine::Gamma(double a, double b) 
  {
    
    return gsl_ran_gamma(  fRng->Rng(), a, b);
  }
  double GSLRandomEngine::LogNormal(double zeta, double sigma)
  {
    
    return gsl_ran_lognormal(  fRng->Rng(), zeta, sigma);
  }
  double GSLRandomEngine::ChiSquare(double nu)
  {
    
    return gsl_ran_chisq(  fRng->Rng(), nu);
  }
  double GSLRandomEngine::FDist(double nu1, double nu2)  
  {
    
    return gsl_ran_fdist(  fRng->Rng(), nu1, nu2);
  }
  double GSLRandomEngine::tDist(double nu)  
  {
    
    return gsl_ran_tdist(  fRng->Rng(), nu);
  }
  
  void GSLRandomEngine::Dir2D(double &x, double &y) 
  { 
    
    gsl_ran_dir_2d(  fRng->Rng(), &x, &y);
  }
  void GSLRandomEngine::Dir3D(double &x, double &y, double &z) 
  { 
    
    gsl_ran_dir_3d(  fRng->Rng(), &x, &y, &z);
  }
  
  unsigned int GSLRandomEngine::Poisson(double mu) 
  { 
    
    return gsl_ran_poisson(  fRng->Rng(), mu);
  }
  unsigned int GSLRandomEngine::Binomial(double p, unsigned int n) 
  { 
    
    return gsl_ran_binomial(  fRng->Rng(), p, n);
  }
  std::vector<unsigned int>  GSLRandomEngine::Multinomial( unsigned int ntot, const std::vector<double> & p ) 
  { 
    
    unsigned int * narray = new unsigned int(p.size() ); 
    gsl_ran_multinomial(  fRng->Rng(), p.size(), ntot, &p.front(), narray);
    std::vector<unsigned int> ival( narray, narray+p.size()); 
    return ival; 
  }
  
  
  
  
  GSLRngMT::GSLRngMT() : 
    GSLRandomEngine(new GSLRng(gsl_rng_mt19937) )
  {}
  GSLRngRanLux::GSLRngRanLux() : 
    GSLRandomEngine(new GSLRng(gsl_rng_ranlux) )
  {}
  
  GSLRngRanLux2::GSLRngRanLux2() : 
    GSLRandomEngine(new GSLRng(gsl_rng_ranlxs2) )
  {}
  
  GSLRngRanLux48::GSLRngRanLux48() : 
    GSLRandomEngine(new GSLRng(gsl_rng_ranlxd2) )
  {}
  
  GSLRngTaus::GSLRngTaus() : 
    GSLRandomEngine(new GSLRng(gsl_rng_taus2) )
  {}
  
  GSLRngGFSR4::GSLRngGFSR4() : 
    GSLRandomEngine(new GSLRng(gsl_rng_gfsr4) )
  {}
  
  GSLRngCMRG::GSLRngCMRG() : 
    GSLRandomEngine(new GSLRng(gsl_rng_cmrg) )
  {}
  
  GSLRngMRG::GSLRngMRG() : 
    GSLRandomEngine(new GSLRng(gsl_rng_mrg) )
  {}
  
  GSLRngRand::GSLRngRand() : 
    GSLRandomEngine(new GSLRng(gsl_rng_rand) )
  {}
  
  GSLRngRanMar::GSLRngRanMar() : 
    GSLRandomEngine(new GSLRng(gsl_rng_ranmar) )
  {}
  
  GSLRngMinStd::GSLRngMinStd() : 
    GSLRandomEngine(new GSLRng(gsl_rng_minstd) )
  {}
} 
} 
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.