合同乱数ジェネレーター クラスの適切なクラス階層を作成しようとしています (つまり、3 つの整数パラメーター - M、a、bがあることを意味します)。基本クラスは派生クラスのインターフェイスを提供する必要があり (したがって、抽象化する必要があります)、派生クラスではM、a、bをstatic constにする必要があると判断しました (これらは派生クラス全体で同じであるため)。
generate()関数はすべての合同乱数ジェネレーターで同じであるため、その定義は基本クラス内に配置する必要があります。問題は、この関数がM、a、bのすべてを使用することですが、これらを基本クラスでstatic constにすることはできません。
問題を説明するために、考えられる解決策の 1 つを示します。ただし、派生クラスのインスタンスごとに余分なlong long変数を 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();
}