我在嘗試使用std::generate_canonical
時遇到了問題。從我的閱讀cpp-reference.com,我期望std::generate_canonical
生成範圍[0,1)中的數字。 但是,在最新的MSVC 2012(未安裝CTP)上,std::generate_canonical
生成的數字全部爲10^28(見下文)。的確,Microsoft's documentation沒有提及std::generate_canonical
生成數字的範圍。如何使用std :: generate_canonical生成範圍[0,1)內的隨機數?
Microsoft是否不符合此處的標準?或者是標準缺陷,它對std::generate_canonical
的行爲模糊不清?在第二種情況下,我將如何編寫代碼以生成範圍[0,1)內的隨機浮點數?
請考慮下面的示例代碼,我嘗試使用std::generate_canonical
。輸出
#include <random>
#include <limits>
#include <iostream>
int main(int argc, char* argv[])
{
std::random_device rd;
// seed with true source of randomness
std::mt19937 _rng_generator(rd());
for(int n=0; n<10; ++n)
std::cout << std::generate_canonical<double,std::numeric_limits<double>::digits>(_rng_generator) << ' ';
return EXIT_SUCCESS;
}
例子,我得到:
4.85267e+028 2.76741e+028 3.17392e+028 5.84136e+028 1.0037e+028 4.87202e+028 2.53834e+028 4.233e+028 6.43922e+028 2.30694e+028
更新: 我以前已報告的錯誤來Microsoft Connect。該錯誤現已得到修復,修復程序將包含在MSVC 2014 RTM中。
我使用G ++ 4.8在Linux中編譯了它,它在[0,1)範圍內生成了10個隨機數。我不知道微軟對你做了什麼。 –
Visual Studio 2013也會生成僞造值。 [uniform_real_distribution](http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution)可能適用於你所需要的。 –
@RetiredNinja。事實上,使用[uniform_real_distribution](http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution)將是現在的解決方案。 –