00001
00020 #include "srandom.h"
00021 #include <string>
00022
00023 void SRandom::setSeed(unsigned long seed) {
00024 m_seed = seed;
00025 changed = 1;
00026 }
00027
00028 #define M 714025
00029 #define IA 1366
00030 #define IC 150889
00031
00032 SRandom::SRandom(unsigned long seed) {
00033 setSeed(seed);
00034 }
00035
00036 double SRandom::rand(void) {
00037 int j;
00038 static long ir[98],iy;
00039 static long idum = m_seed;
00040 static int iff=0;
00041
00042 if (idum < 0 || iff == 0 || changed == 1) {
00043 iff=1;
00044 if ((idum=(IC-(idum)) % M) < 0) idum = -(idum);
00045 for (j=1;j<=97;j++) {
00046 idum=(IA*(idum)+IC) % M;
00047 ir[j]=(idum);
00048 }
00049 idum=(IA*(idum)+IC) % M;
00050 iy=(idum);
00051 changed = 0;
00052 }
00053 j=(int)(1 + 97.0*(iy)/M);
00054
00055 if (j > 97 || j < 1)
00056 throw new std::string("Failure in random number generator");
00057
00058 iy=ir[j];
00059 idum=(IA*(idum)+IC) % M;
00060 ir[j]=(idum);
00061 m_seed = idum;
00062
00063 return (float) (iy)/M;
00064 }
00065
00066 unsigned long SRandom::getSeed(void) {
00067 return m_seed;
00068 }