【问题标题】:random not working + counting time in C++随机不工作 + C++ 中的计数时间
【发布时间】:2018-03-28 01:26:43
【问题描述】:

运行下面的代码时,出现以下错误。你能解释一下为什么以及我应该做什么吗?我在网上找到了与图书馆相关的代码,但它不起作用。我正在使用 DevC++ 5.11。

  1. default_random_engine 不是“std”的成员
  2. uniform_real_distribution 不是“std”的成员
  3. 'generator' 未在此范围内声明
  4. 'distribution' 未在此范围内声明

另外,我如何在 C++ 中计算时间?

    #include <iostream>
    #include <random> 

    int main() {        

    int i, j, n, nmax;   
    std::default_random_engine generator;   
    std::uniform_real_distribution<double> distribution(0.0,1.0);                                   
    nmax = 3000;    

    for (n=200; n<nmax; i+=200) {       
       double x[n], y[n], A[n][n];      
       for (i=0; i<n; i++) {            
          x[i] = distribution(generator);           
          y[i] = 0;             
          for (j=0; j<n; j++) {
             A[i][j] = distribution(generator);             
          }         
       }        
       // start counting time 
       for (i=0; i<n; i++) {            
          for (j=0; j<n; j++) {
             y[i] = A[i,j] * x[j];          
          }         
       }        
       // stop counting time        
       // total_time = stop - start         
       // std::cout << total_time   
    } 
    return 0;    
    }

【问题讨论】:

标签: c++ random time std


【解决方案1】:

代码中的错误:

1. default_random_engineuniform_real_distribution 不是 C++98 标准,因此所有四个错误都与此有关。你应该在你的机器上安装 C++11 编译器。 Here 如果您在选项部分使用标准,您就会明白我的意思。

2.将A[i,j]改为A[i][j]

3. 您应该在第一个 for 循环中将 i+=200 更改为 n+=200

4. 可以这样创建二维矢量:
vector&lt;vector&lt;int&gt;&gt; vec(row_num, vector&lt;int&gt;(col_num));

计算执行时间开始,您可以使用&lt;time.h&gt;。这是使用std::vector的工作代码:

#include <iostream>
#include <random> 
#include <time.h>
#include <vector>

int main()
{
    int nmax;
    std::default_random_engine generator;
    std::uniform_real_distribution<double> distribution(0.0,1.0);
    nmax = 3000;

    for (int n=200; n < nmax; n+=200) {
        std::vector<double> x(n);
        std::vector<double> y(n);
        std::vector< std::vector<double> > A(n, std::vector<double>(n));

        for (int i=0; i<n; i++) {
            x[i] = distribution(generator);
            y[i] = 0;

            for (int j=0; j<n; j++) {
                A[i][j] = distribution(generator);
            }
        }

        // start counting time
        clock_t start = clock();
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                y[i] = A[i][j] * x[j];
            }
        }
        // stop counting time
        clock_t stop = clock();
        // total_time = stop - start
        double elapsed = (double)(stop - start) * 1000.0 / CLOCKS_PER_SEC;
        std::cout << "Elapsed time: " << elapsed << std::endl;
    }
    return 0;
}

【讨论】:

  • 嘿,Eziz,非常感谢您的提示!代码运行,但在第二次迭代后,我收到错误消息:“进程在 3.299 秒后退出,返回值 3221225725”。有什么线索吗?编译器没有错误和警告。
  • @vprado double x[n], y[n], A[n][n]; 都是可变长度数组,一些编译器支持的非标准特性(为了 C99 兼容性)。它们被分配在堆栈上,并且鉴于您的最后一次迭代将声明一个 2800x2800 的 ints 数组,它会用完空间。请改用std::vector
  • @vprado,不客气。对不起这是我的错。 @Bob__ 是对的,x[n] 是 VLA,它不是 C++ 标准。您可以使用vector 或使用动态内存分配。
  • 好吧,Eziz,我还是有麻烦!我包含了向量库并将 x 和 y 声明为双精度向量 vector&lt;double&gt;。但是A矩阵呢?我尝试将其声明为双精度向量 vector&lt;vector&lt;double&gt;&gt; 的向量,但它不起作用。
  • @vprado,我编辑了代码。我希望这次会有所帮助。干杯))
猜你喜欢
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多