これは既に議論されている場合は私を許してください。boost :: randomとboost:uniform_realはfloatではなくdoubleで動作しますか?
template <typename N> N getRandom(int min, int max)
{
timeval t;
gettimeofday(&t,NULL);
boost::mt19937 seed((int)t.tv_sec);
boost::uniform_int<> dist(min, max);
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > random(seed, dist);
return random();
}
//! partial specialization for real numbers
template <typename N> N getRandom(N min, N max)
{
timeval t;
gettimeofday(&t,NULL);
boost::mt19937 seed((int)t.tv_sec);
boost::uniform_real<> dist(min,max);
boost::variate_generator<boost::mt19937&, boost::uniform_real<> > random(seed,dist);
return random();
}
は今、私はint型、floatとdouble型を持つ関数をテストしてみた:私は:: uniform_int後押しと後押し:: uniform_realは、テンプレート引数に依存し、同じ型を返す必要があります使用するテンプレート機能を持っています。 intでうまく動作し、doubleでうまく動作しますが、浮動小数点数では機能しません。 floatをint型に変換するか、キャストに問題があるかのようです。理由は、私がそうしているからです。
float y = getRandom<float>(0.0,5.0);
私はいつもintバックを取得します。 しかし、私が言ったように、それは倍で動作します。 私が間違っているか紛失していることがありますか? ありがとうございました!
アレックス、あなたはいけませんこのように乱数を生成する。あなたは、関数への呼び出しのたびにあなたの種子を再生成しています。つまり、良いPRNGがあなたに与える素晴らしい保証をすべて失うことになります。あなたが生成している数字は、実際には「非ランダム」かもしれません。 – Richard
@リチャードあなたはこれを観察した最初の人です!私はこの質問に約2年前に尋ねましたが、誰も気付いていませんでした。そして、はい、あなたは絶対に正しいです、私はこのようにPRNGを台無しにしています。私はそれ以来、私は適切なPRNGが必要なときは常にメルセンヌツイスターを使用してきました。それを言及してくれてありがとう:) –