3

当我运行这段代码时,它只是挂在 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;
}
4

3 回答 3

7

std::uniform_int不是 C++11。你应该使用std::uniform_int_distribution. 并且std::normal_distribution<T>要求T是浮点类型(C++11 标准 26.5.8.5.1)。

事实上,如果你的 gcc >= 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
于 2012-04-29T05:29:49.277 回答
0

这个对我有用。

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

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

  • Ubuntu 10.10
  • g++ 4.4.5
  • 提升 1.40
  • 编译g++ main.cpp -std=c++0x -o tst
于 2012-04-29T05:07:01.927 回答
0

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

于 2012-07-31T16:40:59.880 回答