如果已經討論過,請原諒我。我有它使用的boost :: uniform_int和boost ::取決於模板參數uniform_real,應返回相同類型的模板函數:boost :: random和boost:uniform_real與雙精度浮點數一起工作嗎?
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和雙打功能。 它工作正常與int,它工作正常與雙,但它不適用於浮動。就好像它將float轉換爲int,或者存在一些轉換問題。我說這是因爲當我這樣做:
float y = getRandom<float>(0.0,5.0);
我總是得到一個int回來。然而,就像我說的那樣,它適用於雙打。 有什麼我做錯了或失蹤? 謝謝!
亞歷克斯,你不應該以這種方式產生隨機數。每次調用函數時都會重新生成種子,這意味着您失去了一個好的PRNG可以給你的所有好的保證。您生成的數字實際上可能是「非隨機」。 – Richard
@Richard您是第一個觀察此人的人!差不多兩年前我問過這個問題,沒有人注意到。是的,你是完全正確的,我這樣毀了PRNG。每當我需要一個合適的PRNG時,我就一直使用Mersenne Twister。謝謝你提到它:) –