0

下限と上限の間の乱数を生成するテンプレート化されたクラスが必要です (両方の制限が負になる可能性があります)。これは私がこれまでに持っているものです:

template <typename T>
T RandomGenerator<T>::generate(T lowerLimit, T upperLimit)
{
    static bool initialized = initialize();
    return double(rand()) * (upperLimit - lowerLimit) / RAND_MAX + lowerLimit;
}

template <typename T>
bool RandomGenerator<T>::initialize()
{
    srand(time(NULL));
}

int iVal = RandomGenerator<int>::generate(1, 10); //Generate integers between (and including) 1 and 10.
double dVal = RandomGenerator<double>::generate(-1, 1); //Generate doubles between (and including) -1 and 1.

これは double 値を正しく生成しますが、整数はオフです。ints と doubles の両方の普遍的なソリューションをコーディングする方法を知っている人はいますか? int と double に別の関数は必要ありません。

4

1 に答える 1

1

1 から 10 の間の数値を生成すると、実際には 1.0 から 10.0 の範囲のランダムな double が生成されます。

次に、それを整数に戻すと、数値が切り捨てられます。したがって、1.X は 1 になり、2.X は 2 になります。10.X は 10 になりますが、その範囲で生成される値は正確に 10.0 だけです。関数。

したがって、整数の場合、範囲計算は適切ではありません。

テンプレートを整数用に特化することをお勧めします。

これは実際には丸めの問題ではないことに注意してください。最も近い値に丸めた場合、上位と下位の値は他の値の半分になる可能性があります。

また、ランダム生成が正しいかどうかを判断するために単純に平均を取らないでください。これにより、分布に多くのエラーが隠されます。たとえば、上限と下限の両方が同じ量だけ間違っていたとしても、平均はまだ正しい可能性があります (たとえば、丸めを微調整すると、正しくない場合でも正しく見える可能性があります)。または、数値がフラットではなく、ベルカーブまたは何かにある可能性があります。ヒストグラムを計算します。

于 2013-03-16T11:46:05.743 に答える