// @(#)root/mathcore:$Id$
// Author: Rene Brun   04/03/99

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TRandomGen
#define ROOT_TRandomGen



//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TRandomGen                                                             //
//                                                                      //
// random number generator class template con the engine                //
//                                                        
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TRandom
#include "TRandom.h"
#endif

template<class Engine>
class TRandomGen : public TRandom {

protected:

   Engine  fEngine;   // random number generator engine
public:
   
   TRandomGen(ULong_t seed=1) {
      fEngine.SetSeed(seed);
      SetName(TString::Format("Random_%s",fEngine.Name().c_str() ) );
      SetTitle(TString::Format("Random number generator: %s",fEngine.Name().c_str() ));
   }
   virtual ~TRandomGen() {}
   using TRandom::Rndm; 
   virtual  Double_t Rndm( ) { return fEngine(); }
   virtual  void     RndmArray(Int_t n, Float_t *array) {
      for (int i = 0; i < n; ++i) array[i] = fEngine(); 
   }
   virtual  void     RndmArray(Int_t n, Double_t *array) {
            for (int i = 0; i < n; ++i) array[i] = fEngine(); 
   }
   virtual  void     SetSeed(ULong_t seed=0) {
      fEngine.SetSeed(seed);
   }

   ClassDef(TRandomGen,1)  //Generic Random number generator template on the Engine type
};

// some useful typedef
#include "Math/StdEngine.h"
#include "Math/MixMaxEngine.h"

// not working wight now for this classes
//#define  DEFINE_TEMPL_INSTANCE
#ifdef DEFINE_TEMPL_INSTANCE

extern template class  TRandomGen<ROOT::Math::MixMaxEngine<240,0>>;
extern template class TRandomGen<ROOT::Math::MixMaxEngine<256,2>>;
extern template class TRandomGen<ROOT::Math::MixMaxEngine<256,4>>;
extern template class TRandomGen<ROOT::Math::MixMaxEngine<17,0>>;
extern template class TRandomGen<ROOT::Math::MixMaxEngine<17,1>>;

extern template class  TRandomGen<ROOT::Math::StdEngine<std::mt19937_64> >;
extern template class  TRandomGen<ROOT::Math::StdEngine<std::ranlux48> >;

#endif

typedef TRandomGen<ROOT::Math::MixMaxEngine<240,0>> TRandomMixMax;
typedef TRandomGen<ROOT::Math::MixMaxEngine<256,2>> TRandomMixMax256;
typedef TRandomGen<ROOT::Math::MixMaxEngine<17,0>> TRandomMixMax17;
typedef TRandomGen<ROOT::Math::StdEngine<std::mt19937_64> > TRandomMT64;
typedef TRandomGen<ROOT::Math::StdEngine<std::ranlux48> > TRandomRanlux48;


#endif
 TRandomGen.h:1
 TRandomGen.h:2
 TRandomGen.h:3
 TRandomGen.h:4
 TRandomGen.h:5
 TRandomGen.h:6
 TRandomGen.h:7
 TRandomGen.h:8
 TRandomGen.h:9
 TRandomGen.h:10
 TRandomGen.h:11
 TRandomGen.h:12
 TRandomGen.h:13
 TRandomGen.h:14
 TRandomGen.h:15
 TRandomGen.h:16
 TRandomGen.h:17
 TRandomGen.h:18
 TRandomGen.h:19
 TRandomGen.h:20
 TRandomGen.h:21
 TRandomGen.h:22
 TRandomGen.h:23
 TRandomGen.h:24
 TRandomGen.h:25
 TRandomGen.h:26
 TRandomGen.h:27
 TRandomGen.h:28
 TRandomGen.h:29
 TRandomGen.h:30
 TRandomGen.h:31
 TRandomGen.h:32
 TRandomGen.h:33
 TRandomGen.h:34
 TRandomGen.h:35
 TRandomGen.h:36
 TRandomGen.h:37
 TRandomGen.h:38
 TRandomGen.h:39
 TRandomGen.h:40
 TRandomGen.h:41
 TRandomGen.h:42
 TRandomGen.h:43
 TRandomGen.h:44
 TRandomGen.h:45
 TRandomGen.h:46
 TRandomGen.h:47
 TRandomGen.h:48
 TRandomGen.h:49
 TRandomGen.h:50
 TRandomGen.h:51
 TRandomGen.h:52
 TRandomGen.h:53
 TRandomGen.h:54
 TRandomGen.h:55
 TRandomGen.h:56
 TRandomGen.h:57
 TRandomGen.h:58
 TRandomGen.h:59
 TRandomGen.h:60
 TRandomGen.h:61
 TRandomGen.h:62
 TRandomGen.h:63
 TRandomGen.h:64
 TRandomGen.h:65
 TRandomGen.h:66
 TRandomGen.h:67
 TRandomGen.h:68
 TRandomGen.h:69
 TRandomGen.h:70
 TRandomGen.h:71
 TRandomGen.h:72
 TRandomGen.h:73
 TRandomGen.h:74
 TRandomGen.h:75
 TRandomGen.h:76
 TRandomGen.h:77
 TRandomGen.h:78
 TRandomGen.h:79
 TRandomGen.h:80
 TRandomGen.h:81
 TRandomGen.h:82
 TRandomGen.h:83
 TRandomGen.h:84
 TRandomGen.h:85