我正在尝试为同余随机数生成器类创建一个合理的类层次结构(这意味着它具有 3 个整数参数 - M、a、b)。我决定基类应该为派生类提供一个接口(所以它应该是抽象的),并且M,a,b应该是派生类中的静态常量(因为它们在派生类中是相同的)。
由于generate()函数对于所有同余随机数生成器都是相同的,所以它的定义应该放在基类中。问题是这个函数使用了所有的M,a,b,但这些不能在基类中成为static const 。
为了说明问题,提供了一种可能的解决方案。但是,我对它并不完全满意,因为它为派生类的每个实例创建了 3 个超长变量,所以我想知道是否可以提出更优雅的设计。
class RandomGenerator{
protected:
unsigned int seed;
const long long int M;
const long long int a;
const long long int b;
public:
RandomGenerator(unsigned int, long long, long long, long long);
virtual long double generate() const = 0;
};
long double RandomGenerator::generate() const{
static long long prv = seed;
return (long double) (prv = (a * prv + b) % M) / (M-1);
}
class RandU : public RandomGenerator {
private:
static const long long M = 2147483648LL;
static const long long a = 65539;
static const long long b = 0;
public:
RandU(unsigned int);
virtual long double generate() const;
};
RandU::RandU(unsigned int nseed): RandomGenerator(nseed, M, a, b){}
long double RandU::generate() const{
return RandomGenerator::generate();
}