#include <cstdio> #include <cstdlib> #include <cstdint> struct IRandom { virtual void Delete() = 0; virtual std::uint32_t Next() = 0; }; class CRandomStd : public IRandom { public: CRandomStd(std::uint32_t seed) { holdrand = seed; } public: virtual void Delete() { delete this; } virtual std::uint32_t Next() { return (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); } private: std::uint32_t holdrand; }; class CRandomPrime : public IRandom { public: CRandomPrime(std::uint32_t seed) { n = seed; } public: virtual void Delete() { delete this; } virtual std::uint32_t Next() { return n *= 0x9E3779B1; } private: std::uint32_t n; }; class CRandomXorShift : public IRandom { public: CRandomXorShift(std::uint32_t seed) { x = seed; y = 362436069; z = 521288629; w = 88675123; } public: virtual void Delete() { delete this; } virtual std::uint32_t Next() { std::uint32_t t; t = x ^ (x << 11); x = y; y = z; z = w; return w = w ^ (w >> 19) ^ (t ^ (t >> 8)); } private: std::uint32_t x; std::uint32_t y; std::uint32_t z; std::uint32_t w; }; int main() { srand(10); IRandom* rander = new CRandomStd(10); for (int i = 0; i < 10; i++) { printf("%u %u\\n", rander->Next(), rand()); } return getchar(); }
参考:
http://www.cnblogs.com/xkfz007/archive/2012/08/25/2656893.html
http://www.cnblogs.com/forget406/p/5294143.html
http://blog.topspeedsnail.com/archives/1366