36 TRandom2::TRandom2(UInt_t seed)
39 SetTitle(
"Random number generator with period of about 10**26");
56 Double_t TRandom2::Rndm()
58 #define TAUSWORTHE(s,a,b,c,d) (((s &c) <<d) & 0xffffffffUL ) ^ ((((s <<a) & 0xffffffffUL )^s) >>b)
61 const double kScale = 2.3283064365386963e-10;
63 fSeed = TAUSWORTHE (fSeed, 13, 19, 4294967294UL, 12);
64 fSeed1 = TAUSWORTHE (fSeed1, 2, 25, 4294967288UL, 4);
65 fSeed2 = TAUSWORTHE (fSeed2, 3, 11, 4294967280UL, 17);
67 UInt_t iy = fSeed ^ fSeed1 ^ fSeed2;
68 if (iy)
return kScale*
static_cast<Double_t
>(iy);
75 void TRandom2::RndmArray(Int_t n, Float_t *array)
77 const double kScale = 2.3283064365386963e-10;
81 for(Int_t i=0; i<n; i++) {
82 fSeed = TAUSWORTHE (fSeed, 13, 19, 4294967294UL, 12);
83 fSeed1 = TAUSWORTHE (fSeed1, 2, 25, 4294967288UL, 4);
84 fSeed2 = TAUSWORTHE (fSeed2, 3, 11, 4294967280UL, 17);
86 iy = fSeed ^ fSeed1 ^ fSeed2;
87 if (iy) array[i] = (Float_t)(kScale*static_cast<Double_t>(iy));
88 else array[i] = Rndm();
95 void TRandom2::RndmArray(Int_t n, Double_t *array)
97 const double kScale = 2.3283064365386963e-10;
100 for(Int_t i=0; i<n; i++) {
101 fSeed = TAUSWORTHE (fSeed, 13, 19, 4294967294UL, 12);
102 fSeed1 = TAUSWORTHE (fSeed1, 2, 25, 4294967288UL, 4);
103 fSeed2 = TAUSWORTHE (fSeed2, 3, 11, 4294967280UL, 17);
105 iy = fSeed ^ fSeed1 ^ fSeed2;
106 if (iy) array[i] = kScale*
static_cast<Double_t
>(iy);
107 else array[i] = Rndm();
120 void TRandom2::SetSeed(ULong_t seed)
122 #define LCG(n) ((69069 * n) & 0xffffffffUL) // linear congurential generator
126 if (fSeed < 2) fSeed += 2UL;
127 fSeed1 = LCG (fSeed);
128 if (fSeed1 < 8) fSeed1 += 8UL;
129 fSeed2 = LCG (fSeed1);
130 if (fSeed2 < 16) fSeed2 += 16UL;
136 fSeed = UInt_t(uuid[3])*16777216 + UInt_t(uuid[2])*65536 + UInt_t(uuid[1])*256 + UInt_t(uuid[0]);
137 fSeed1 = UInt_t(uuid[7])*16777216 + UInt_t(uuid[6])*65536 + UInt_t(uuid[5])*256 + UInt_t(uuid[4]);
138 fSeed2 = UInt_t(uuid[11])*16777216 + UInt_t(uuid[10])*65536 + UInt_t(uuid[9])*256 + UInt_t(uuid[8]);
140 UInt_t seed3 = UInt_t(uuid[15])*16777216 + UInt_t(uuid[14])*65536 + UInt_t(uuid[13])*256 + UInt_t(uuid[12]);
149 if (fSeed < 2) fSeed += 2UL;
150 if (fSeed1 < 8) fSeed1 += 8UL;
151 if (fSeed2 < 16) fSeed2 += 16UL;
155 for (
int i = 0; i < 6; ++i)