/* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://lammps.sandia.gov/, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. This software is distributed under the GNU General Public License. See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ // Park/Miller RNG #include #include "random_park.h" //#include "error.h" #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 /* ---------------------------------------------------------------------- */ RanPark::RanPark(int seed_init) { //if (seed_init <= 0) // error->one(FLERR,"Invalid seed for Park random # generator"); seed = seed_init; save = 0; } /* ---------------------------------------------------------------------- uniform RN ------------------------------------------------------------------------- */ double RanPark::uniform() { int k = seed/IQ; seed = IA*(seed-k*IQ) - IR*k; if (seed < 0) seed += IM; double ans = AM*seed; return ans; } /* ---------------------------------------------------------------------- gaussian RN ------------------------------------------------------------------------- */ double RanPark::gaussian() { double first,v1,v2,rsq,fac; if (!save) { do { v1 = 2.0*uniform()-1.0; v2 = 2.0*uniform()-1.0; rsq = v1*v1 + v2*v2; } while ((rsq >= 1.0) || (rsq == 0.0)); fac = sqrt(-2.0*log(rsq)/rsq); second = v1*fac; first = v2*fac; save = 1; } else { first = second; save = 0; } return first; }