我想要创建一个函数,根据元素作为概率的值,随机返回向量的索引:
float getRandomIndex(const vector<float>& v){
random_device r;
mt19937 m(r());
return discrete_distribution<>(v.begin(),v.end())(m);
}
int main(){
for(int i=0;i<10;i++){
vector<float> a{0.9,0.1};
cout << getRandomIndex(a) << endl;
}
return 0;
}现在我想减少行号,所以尝试将函数重写为:
float getRandomIndex(const vector<float>& v){
mt19937 m(random_device()());
return discrete_distribution<>(v.begin(),v.end())(m);
}但未能编译:
error: function cannot return function type 'std::__1::random_device ()'
mt19937 m(random_device()());
^
warning: parentheses were disambiguated as a function declaration [-Wvexing-parse]
mt19937 m(random_device()());
^~~~~~~~~~~~~~~~~~~
note: add a pair of parentheses to declare a variable
mt19937 m(random_device()());
^
(生成一个警告和一个错误。
但我试着
random_device r;
cout << r() << endl;和
cout << random_device()() << endl;它们似乎具有相同的函数,为什么我不能将变量r替换为在random_device中立即创建的mt19937呢?
发布于 2015-12-04 05:26:10
最烦人的解析再次出击!在本例中,random_device()()部件被解析为一个函数,返回一个返回random_device的函数。在这种情况下,代码可以创建一个临时变量,也可以声明一个函数。编译器被迫假定它是一个函数声明。
您可以用大括号或额外的括号修复它。
m(random_device{}()) //uniform initialization syntax, will work
m((random_device()())) //extra parenthesis, also will workhttps://stackoverflow.com/questions/34081343
复制相似问题