Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

51 lines
1.2 KiB
C++

// MinimalStandardRandom
// 2013/9/28
// http://c-faq.com/lib/rand.html
#ifndef MinimalStandardRandom_h
#define MinimalStandardRandom_h
// NOTE: The size of int is 4 bytes and the size of long long is
// 8 bytes on Linux, Mac and Windows. The size of long is 4 bytes
// on Windows 32/64 and 32-bit Linux/Mac, but is 8 bytes on 64-bit
// Linux/Mac. Consequently, we do not use long as shown in the c-faq.
// http://software.intel.com/en-us/articles/size-of-long-integer-type-on-different-architecture-and-os
#include <time.h>
class MinimalStandardRandom
{ static const int a=48271;//16807;
static const int m=2147483647;
static const int q=m/a;
static const int r=m%a;
int seed;
public:
MinimalStandardRandom(int seed=0)
: seed(seed)
{ if(!seed)
{ time_t seconds;
time(&seconds);
this->seed=(int) seconds;
} }
int NextPositive() // range [1, 2147483646], except 0
{ const int hi = seed / q;
const int lo = seed % q;
const int test = a * lo - r * hi;
if(test > 0)
{ seed = test;
}
else
{ seed = test + m;
}
return seed;
}
int Next() // range +-2147483646 except 0
{ const int hi = seed / q;
const int lo = seed % q;
seed = a * lo - r * hi;
return seed;
}
};
#endif