从一个随机双精度矢量中制作多个向量

时间:2014-03-10 16:58:56

标签: c++ c++11 random vector

我正在生成20,000个随机数(双精度)的向量,我想,除了将数字放在此向量中,在此处称为A之外,还将0.0到0.1之间的所有数字复制到单独的向量中。当我尝试这样做时,我的编译器(最新的g ++版本)给了我这些错误:

"error: request member 'begin' in 'r0', which is of non-class type 'std::vector<double>()' for (it0=r0.begin(); it0!=r0.end();++it0)"

"error: request member 'end' in 'r0', which is of non-class type 'std::vector<double>()' for (it0=r0.begin(); it0!=r0.end();++it0)"

"error: request for member 'emplace_back' in 'r0', which is of non-class type 'std::vector<double>()' r0.emplace_back(A[i]);"

我是C ++的相对新手,但我认为向量数据结构有名为.begin()和.end()的方法/成员函数,它们可以帮助使用迭代器访问它。在我看来,编译器没有看到我的矢量作为矢量?我真的不确定,但下面就是我所做的:

我已链接:iostream,cmath,fstream,time.h,cstdlib,vector,stdio.h,cstdio,iomainip,algorithm(按此顺序)

以下是我现在的代码:

int main() {
double N=20000; 
std::vector<double> A(N+1); 
std::vector<double> r0(); 
std::vector<double>::iterator it0;

std::srand((unsigned)time(0));

for(double i = 0; i<(N+1); ++i) {
    double high = 1.0, low = 0.0;
    A[i]=((double) rand()/(static_cast<double>(RAND_MAX) + 1.0))*(high - low)+low;

    for(it0=r0.begin(); it0!=r0.end(); ++it0) { 
            if(0.0<=A[i] && A[i]<0.1) { //NOTE:post-incrementing creates an unnecessary temporary iterator 
        rand1.emplace_back(A[i]);                        
        count0++;           
            }
    }
}
return 0;
}

这一点是我将向量A中的所有数字放入每个大小为0.1的区间,从0.0开始,然后使用gnuplot在直方图中绘制它们以评估随机数的均匀性(使用linux mint附带的伪随机数生成器)。 另外,我想问一下.emplace_back()的优点是什么.push_back()。非常感谢您的帮助!我真的很感激,因为我不知道自己做错了什么。

2 个答案:

答案 0 :(得分:2)

std::vector<double> r0();

你已成为most vexing parse的受害者(虽然这个案例可能不像链接的例子那样烦恼)。上面的行定义了一个名为r0的函数,该函数不带参数,并按值返回std::vector<double>。摆脱尾随的括号,你的代码应该编译。


您的代码中的另一个奇怪之处在于您说您要生成20,000个随机数,但是您生成的是20,001。您不需要继续使用N+1,请将其替换为N

正如lizusek在评论中指出的那样,你在下面的语句中毫无意义地迭代空向量(r0):

for(it0=r0.begin(); it0!=r0.end(); ++it0) { // this loop is never entered

最后,你不应该再使用rand()和朋友了,C ++ 11在<random>标题中提供了更优越的随机数生成功能。我将你的代码重写为

std::mt19937 gen(std::random_device{}());
std::uniform_real_distribution<> dis(0, 1);
for(int i=0; i<N; ++i) {
    A[i] = dis(gen);

    if(A[i] > 0 && A[i] < 0.1) {
      // add this to the r0 vector
      r0.push_back(A[i]);
    }
}

答案 1 :(得分:1)

std::vector<double> r0(); 

将其解析为不带参数的函数并返回std::vector<double>。这称为most vexing parse错误。循环中也有错误。这应该是:

std::vector<double> r0;

for( int i = 0; i < N+1; ++i) { 
            if(0.0<=A[i] && A[i]<0.1) {
            //...          
            }
}