タイプに基づいた乱数の作成にVS2010のテンプレートを使用しようとしています。私は以下のコードを使用しています:
template<class BaseT>
struct distribution
{ // general case, assuming T is of integral type
typedef std::tr1::uniform_int<BaseT> dist_type;
};
template<>
struct distribution<float>
{ // float case
typedef std::tr1::uniform_real<float> dist_type;
};
template<>
struct distribution<double>
{ // double case
typedef std::tr1::uniform_real_distribution<double> dist_type;
};
template<class BaseT>
class BaseTypeRandomizer
{
public:
BaseTypeRandomizer() : mEngine(std::time(0))
{
}
void CreateValues(std::vector<BaseT>& Values, size_t nValues)
{
typedef typename distribution<BaseT>::dist_type distro_type;
std::random_device Engine;
distro_type dist(std::numeric_limits<BaseT>::min(), std::numeric_limits<BaseT>::max());
for (size_t iVal = 0; iVal < nValues; ++iVal)
{
Values[iVal] = dist(Engine);
}
}
};
残念ながら、char
//など(整数型)のBaseTypeRandomizerのオブジェクトを作成すると、範囲全体をカバーする数値が返されますが、floatとdoubleの場合は返されません。フロートはすべてとの間にあり、ダブルはとの間にあります(または少なくともすべてがその近隣にあります)。VSデバッガーでオブジェクトをチェックすると、制限が正しいことがわかりますが、ベクトルははるかに狭い範囲の数値で埋められます。int
long
1e+37
9e+38
1e+307
2e+308
dist
Values
制限が正しく機能しない理由を誰かが知っていますか?