0

次のコードは、乱数を生成します。テンプレートを使用して、引数の型に応じて入力範囲間の乱数を生成するように変更しました。

#include <iostream>
#include <ctime>
#include <iomanip>
#include <limits>

using namespace std;

template <class T>
T generateRandomNumber(T startRange, T endRange)
{
    T randNum = startRange + (T)rand()/((T)RAND_MAX/(T)(endRange-startRange));
    return(randNum);  // It was the ERROR
}
int main()
{
    srand((unsigned)time(0));

    cout << generateRandomNumber(0,100);

    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    cout << generateRandomNumber(0.0,99.99);
    return 0;
}

この関数はintegerに対しては正常に機能しますが、doubleに対しては常に0.00を生成します。

参考文献: C++ ランダム浮動小数点数生成

編集: generateRandomNumber() に return ステートメントを追加しました

4

3 に答える 3

3

あなたは本当に使うべき-Wallです。もしそうなら、あなたのコンパイラはおそらくあなたに次のようなことを言ったでしょう:

badrand.cc:11:7: warning: unused variable ‘randNum’ [-Wunused-variable]
badrand.cc:12:1: warning: no return statement in function returning non-void [-Wreturn-type

つまり、generateRandomNumber決して値を返しません。randNum代わりに、すぐにスコープ外になるローカル変数に割り当てます。

試す:

template <class T>
T generateRandomNumber(T startRange, T endRange)
{
    return startRange + (T)rand()/((T)RAND_MAX/(T)(endRange-startRange));
}

または、おそらくもっと読みやすい:

template <class T>
T generateRandomNumber(T startRange, T endRange)
{
    return startRange + T(rand()) / T(RAND_MAX) * (endRange - startRange));
}
于 2013-10-31T06:08:58.733 に答える
2

Stephan T. Lavavej のrand() は、Going Native 2013 の有害なプレゼンテーションと見なされ、C++11 の乱数生成機能を使用し、rand() を回避する方法と理由について説明しています。

于 2013-10-31T06:01:44.103 に答える
1

参考までに、コンパイル エラーが発生します (インクルード <cstdlib>)。

しかし、本当の問題は、から何も返さないことですgenerateRandomNumber

そして、区切りのために改行を印刷することをお勧めします。

#include <cstdlib>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <limits>

using namespace std;

template <class T>
T generateRandomNumber(T startRange, T endRange)
{
    return startRange + (T)rand()/((T)RAND_MAX/(T)(endRange-startRange));
}
int main()
{
    srand((unsigned)time(0));

    cout << generateRandomNumber(0,100) << "\n";

    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    cout << generateRandomNumber(0.0,99.99) << "\n";
    return 0;
}
于 2013-10-31T06:06:59.777 に答える