17 #ifndef ROOT_Math_MixMaxEngine_icc
18 #define ROOT_Math_MixMaxEngine_icc
20 #ifndef ROOT_Math_MixMaxEngine
21 #error "Do not use MixMaxEngine.icc directly. #include \"MixMaxEngine.h\" instead."
22 #endif // ROOT_Math_MixMaxEngine
34 template<
int N,
int S>
35 MixMaxEngine<N,S>::MixMaxEngine(uint64_t seed) {
38 fRng =
new MixMaxEngineImpl<N>(seed);
41 template<
int N,
int S>
42 MixMaxEngine<N,S>::~MixMaxEngine() {
43 if (fRng)
delete fRng;
52 template<
int N,
int S>
53 void MixMaxEngine<N,S>::SetSeed(uint64_t seed) {
72 template<
int SkipNumber>
74 template<
class Engine>
75 static void Apply (Engine * rng,
int counter,
int n) {
77 if (counter < n)
return;
78 for (
int iskip = 0; iskip < SkipNumber; ++iskip)
84 struct SkipFunction<0> {
85 template<
class Engine>
86 static void Apply (Engine *,
int ,
int ) {
91 template<
int N,
int S>
92 double MixMaxEngine<N,S>::Rndm_impl() {
93 int counter = fRng->Counter();
94 SkipFunction<S>::Apply(fRng, counter, N);
97 fRng->SetCounter(counter);
102 template<
int N,
int S>
103 uint64_t MixMaxEngine<N,S>::IntRndm() {
104 int counter = fRng->Counter();
105 SkipFunction<S>::Apply(fRng, counter,N);
106 fRng->SetCounter(counter);
107 return fRng->IntRndm();
110 template<
int N,
int S>
111 uint64_t MixMaxEngine<N,S>::MaxInt() {
113 return 2305843009213693951ULL;
116 template<
int N,
int S>
117 uint64_t MixMaxEngine<N,S>::MinInt() {
122 template<
int N,
int S>
123 void MixMaxEngine<N,S>::RndmArray(
int n,
double *array){
125 for (
int i = 0; i < n; ++i)
126 array[i] = Rndm_impl();
129 template<
int N,
int S>
130 void MixMaxEngine<N,S>::SetState(
const std::vector<StateInt_t> & state) {
131 assert(state.size() >= N);
136 fRng->SetState(state);
140 template<
int N,
int S>
141 void MixMaxEngine<N,S>::GetState(std::vector<StateInt_t> & state)
const {
143 fRng->GetState(state);
146 template<
int N,
int S>
147 int MixMaxEngine<N,S>::Size() {
148 return MixMaxEngineImpl<N>::Size();
151 template<
int N,
int S>
152 int MixMaxEngine<N,S>::Counter()
const {
153 return fRng->Counter();
156 template<
int N,
int S>
157 const char *MixMaxEngine<N, S>::Name() {
158 static const std::string name =
"MixMax" + Util::ToString(N) + (S > 0 ?
"_" + Util::ToString(S) :
"");