如何使用std :: generate_canonical生成范围[0,1)中的随机数?

Die*_*ter 5 c++ visual-c++ c++11

我在尝试使用时遇到了一个问题std::generate_canonical.从我在cpp-reference.com上的阅读中,我希望std::generate_canonical生成[0,1]范围内的数字.但是,在最新的MSVC 2012(未安装CTP)上,std::generate_canonical生成的数字均为10 ^ 28(见下文).实际上,微软的文档没有提到std::generate_canonical产生数字的范围.

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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出示例:
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中.

awe*_*oon 6

26.5.7.2函数模板generate_canonical [rand.util.canonical]

从本节中所描述26.5.7.2模板实例化的每个功能所提供的均匀的随机数发生器的一个或多个调用的结果映射g到的一个成员指定 RealType为使得,如果值g产生由g均匀分布,实例化的结果tj,0≤ tj<1,如下所述尽可能均匀地分布.

template<class RealType, size_t bits, class URNG> 
RealType generate_canonical(URNG& g);
Run Code Online (Sandbox Code Playgroud)

此外,Standard描述了此函数返回 S/RK,哪里
小号
[R

因此,此函数应返回从0到1的值.我认为,微软的实施在这里是错误的.