Index: trunk/src/randomgenerator.cpp
===================================================================
--- trunk/src/randomgenerator.cpp (revision 316)
+++ trunk/src/randomgenerator.cpp (revision 317)
@@ -1,151 +1,151 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// starlight is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: $: revision of last commit
// $Author:: $: author of last commit
// $Date:: $: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include "randomgenerator.h"
using namespace std;
//USED IN ROOT under TRANDOM3
// Random number generator class based on
// M. Matsumoto and T. Nishimura,
// Mersenne Twistor: A 623-diminsionally equidistributed
// uniform pseudorandom number generator
// ACM Transactions on Modeling and Computer Simulation,
// Vol. 8, No. 1, January 1998, pp 3--30.
//
// For more information see the Mersenne Twistor homepage
// http://www.math.keio.ac.jp/~matumoto/emt.html
//
// Advantage: large period 2**19937-1
// relativly fast
// (only two times slower than TRandom, but
// two times faster than TRandom2)
// Drawback: a relative large internal state of 624 integers
//
//
// Aug.99 ROOT implementation based on CLHEP by P.Malzacher
//
// the original code contains the following copyright notice:
/* This library is free software; you can redistribute it and/or */
/* modify it under the terms of the GNU Library General Public */
/* License as published by the Free Software Foundation; either */
/* version 2 of the License, or (at your option) any later */
/* version. */
/* This library is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */
/* See the GNU Library General Public License for more details. */
/* You should have received a copy of the GNU Library General */
/* Public License along with this library; if not, write to the */
/* Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA */
/* 02111-1307 USA */
/* Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. */
/* When you use this, send an email to: matumoto@math.keio.ac.jp */
/* with an appropriate reference to your work. */
/////////////////////////////////////////////////////////////////////
void randomGenerator::SetSeed(unsigned int seed)
{
// Set the random generator sequence
// if seed is 0 (default value) a TUUID is generated and used to fill
// the first 8 integers of the seed array.
// In this case the seed is guaranteed to be unique in space and time.
// Use upgraded seeding procedure to fix a known problem when seeding with values
// with many zero in the bit pattern (like 2**28).
// see http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html
_count624 = 624;
int i,j;
_Mt[0] = seed;
j = 1;
// use multipliers from Knuth's "Art of Computer Programming" Vol. 2, 3rd Ed. p.106
for(i=j; i<624; i++) {
_Mt[i] = (1812433253 * ( _Mt[i-1] ^ ( _Mt[i-1] >> 30)) + i);
}
}
double randomGenerator::Rndom(int)
{
// Machine independent random number generator.
// Produces uniformly-distributed floating points in [0,1]
// Method: Mersenne Twistor
unsigned int y;
const int kM = 397;
const int kN = 624;
const unsigned int kTemperingMaskB = 0x9d2c5680;
const unsigned int kTemperingMaskC = 0xefc60000;
const unsigned int kUpperMask = 0x80000000;
const unsigned int kLowerMask = 0x7fffffff;
const unsigned int kMatrixA = 0x9908b0df;
if (_count624 >= kN) {
- register int i;
+ int i; // register keyword removed Oct, 2022 by SRK for compatibility with C++ 2017
for (i=0; i < kN-kM; i++) {
y = (_Mt[i] & kUpperMask) | (_Mt[i+1] & kLowerMask);
_Mt[i] = _Mt[i+kM] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
}
for ( ; i < kN-1 ; i++) {
y = (_Mt[i] & kUpperMask) | (_Mt[i+1] & kLowerMask);
_Mt[i] = _Mt[i+kM-kN] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
}
y = (_Mt[kN-1] & kUpperMask) | (_Mt[0] & kLowerMask);
_Mt[kN-1] = _Mt[kM-1] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
_count624 = 0;
}
y = _Mt[_count624++];
y ^= (y >> 11);
y ^= ((y << 7 ) & kTemperingMaskB );
y ^= ((y << 15) & kTemperingMaskC );
y ^= (y >> 18);
if (y) return ( (double) y * 2.3283064365386963e-10); // * Power(2,-32)
return Rndom();
}