【发布时间】:2013-12-15 06:12:19
【问题描述】:
我在尝试使用 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) 范围内的随机浮点数?
我尝试使用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 中。
【问题讨论】:
-
我在 Linux 中使用 G++ 4.8 编译了它,它产生了 10 个 [0,1) 范围内的随机数。我不知道微软对你做了什么。
-
Visual Studio 2013 也会生成虚假值。 uniform_real_distribution 可能会满足您的需求。
-
@RetiredNinja。事实上,使用uniform_real_distribution 将是目前的解决方案。
标签: c++ visual-c++ c++11