https://github.com/root-project/root
Raw File
Tip revision: 2cd3aafb76e161c5e687de877863ffeb4022b4b0 authored by Gerardo Ganis on 11 June 2012, 16:52:22 UTC
Import patch r44048 removing the automatic creation of TDrawFeedback in TProofChain
Tip revision: 2cd3aaf
t1055.cxx
/* -*- C++ -*- */
/*************************************************************************
 * Copyright(c) 1995~2005  Masaharu Goto (cint@pcroot.cern.ch)
 *
 * For the licensing terms see the file COPYING
 *
 ************************************************************************/
/*  Knuth's best random generator, see also Press et al, Numerical Recipes
    Knuth  The Art of Computer Programming Vol 2, 2nd edition, Sec 5.6
    The Code may be done in floating point arithmetic as well
*/
#include <iostream>
  using std::cout;  using std::endl;

double Random( int Seed = 0 )
{ const int  Rand_Max = 1000000000,  // large even number < INT_MAX
             RSeed    =  161803398;
  const double  Scale = 1.0/Rand_Max;
  
  static int RList[55];  // don't change this !
  static int next, nextp = -1;
  int R, S, i, j, k;
  
  if ( !(nextp+1)  ||  Seed < 0 )  // init the generator (must be called)
  { if ( (R= (RSeed+Seed) % Rand_Max) < 0 ) R+= Rand_Max;
cout << "Rand_Max= " << Rand_Max << endl
     << "Scale= " << Scale << endl;
    RList[54]= R;
    S= 1;
    for ( i= 1; i < 55; i++ )
    { j= (21*i)%55 - 1;
      RList[j]= S;
      if ( (S= R-S) < 0 ) S+= Rand_Max;
      R= RList[j];
    }
    for ( k= 1; k <= 4; k++ )
      for ( i= 0; i < 55; i++ )
        if ( (RList[i]-= RList[(i+31)%55]) < 0 ) RList[i]+= Rand_Max;
        
    next= -1;  nextp= 30;
  } // end of initialization
  
  if ( ++next  == 55 ) next= 0;
  if ( ++nextp == 55 ) nextp= 0;
  
  if ( (R= RList[next] - RList[nextp]) < 0 ) R+= Rand_Max;
  RList[next]= R;
  
  return  R*Scale;
}


int main() {
  double R;
  for (int i=1; i <= 10; ++i ) {
    R= Random();
    cout << R << endl;
  }
  return 0;
}
back to top