当我运行此代码时,只是挂起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;
}
答案 0 :(得分:7)
std::uniform_int
不是C ++ 11。您应该使用std::uniform_int_distribution
。 std::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托管服务提供商上很常见。
编辑:如果我们分享开发环境的详细信息,也许会有所帮助。适用于我:
g++ main.cpp -std=c++0x -o tst
答案 2 :(得分:0)
我想我可以猜到。您应该为正态分布生成器提供一个引擎,该引擎生成0..1范围内的浮点数。相反,它错误地被喂食了整数饮食。用于正态分布的常见算法成对地消耗这些数字,并且循环直到它找到一对,其被认为是2空间中的点,具有小于1并且不等于零的笛卡尔范数。由于算法只被整数馈送,所以从未发生过。但它永远不会放弃。