随机数的正态分布挂起程序?

时间:2012-04-29 04:50:06

标签: c++ random c++11

当我运行此代码时,只是挂起for循环,你能解释一下原因吗?

#include<iostream>
#include<random>
#include<ctime>

int main()
{
    using std::cout;
    using std::endl;
    using std::cin;
    using std::mt19937;
    using std::minstd_rand;
    using std::uniform_int;
    using std::normal_distribution;

    // engines
    mt19937 rng;
    minstd_rand gen;

    // distributions
    uniform_int<int> dist(0, 37);
    normal_distribution<short> norm(4, 3);

    // initializaiton
    rng.seed(static_cast<unsigned int>(time(false)));
    gen.seed(static_cast<unsigned short>(time(false)));



    // generate numbers
    for(int i = 0; i < 10; ++i)
        std::cout << dist(rng) << "     " << norm(gen) << endl; // This is as far as this code goes

    cin.get();
    return 0;
}

3 个答案:

答案 0 :(得分:7)

std::uniform_int不是C ++ 11。您应该使用std::uniform_int_distributionstd::normal_distribution<T>要求T为浮点类型(C ++ 11标准26.5.8.5.1)。

事实上,如果您有gcc&gt; = 4.5,您应该收到类似以下内容的错误:

/opt/local/include/gcc47/c++/bits/random.h: In instantiation of 'class std::normal_distribution<short int>':
my_random.cpp:21:36:   required from here
/opt/local/include/gcc47/c++/bits/random.h:1982:7: error: static assertion failed: template argument not a floating point type

答案 1 :(得分:0)

它对我有用。

这些功能可能试图从/dev/random中获取随机数据,如果没有高质量的随机数据可以阻止这些数据。我注意到这在廉价的VPS托管服务提供商上很常见。

编辑:如果我们分享开发环境的详细信息,也许会有所帮助。适用于我:

  • Ubuntu 10.10
  • g ++ 4.4.5
  • boost 1.40
  • 使用g++ main.cpp -std=c++0x -o tst
  • 编译

答案 2 :(得分:0)

我想我可以猜到。您应该为正态分布生成器提供一个引擎,该引擎生成0..1范围内的浮点数。相反,它错误地被喂食了整数饮食。用于正态分布的常见算法成对地消耗这些数字,并且循环直到它找到一对,其被认为是2空间中的点,具有小于1并且不等于零的笛卡尔范数。由于算法只被整数馈送,所以从未发生过。但它永远不会放弃。