代码之家  ›  专栏  ›  技术社区  ›  Megasa3

使用随机值初始化二维向量

  •  0
  • Megasa3  · 技术社区  · 7 年前

    我正试图用随机数初始化一个双向量数组(实际上是一个矩阵),但我肯定是出了什么问题,我还没有在这里或谷歌上找到解决方案。

    我有下一个“标准”定义,它用0初始化我的矩阵:

    案例1:

     int num_rows=5, num_cols=7;
     std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, 0));
    

    所以如果我做这样的东西:

    案例2

          std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, rand()%100));
    

    我看到的是 rand()%100 如果返回,则调用一次 34 然后我所有的矩阵都会填入这个数字。

    在这一点上,我尝试使用 案例1 初始化和使用类似迭代器的double for:

    for ( std::vector<std::vector<int>>::iterator it1 = Matrix.begin(); it1 != Matrix.end(); ++it1 )
    {
        for ( std::vector<int>::iterator it2 = (*it1).begin(); it2 != (*it1).end(); ++ it2 )
        {
            std::cout << (*it2) << "\n"; //With that I can see every value on the matrix... right now all 0 
    
        }
    }
    

    现在,在这个循环中,我找不到一条一条地给它们分配新值的方法。我很抱歉,因为我很有良心,这是一个非常简单的问题,但在谷歌上找不到。。。

    由于it2是我必须使用的变量,如果我尝试制作类似于上面下一个的内容,它不会编译,甚至intellisense也不允许我将de“assign”(因为我完全错了ofc):

    it2.assign(...) 
    (*it2).assign(...)
    it1->assign // Here intellisense works but i don't think this it my option.
    //
    Matrix(it2,rand()%100); // error
    
    Matrix[it1][it2] = rand() % 100; // Desperate...like normal array?
    Matrix.at(it2) = rand()%100;  
    Matrix.at(it1).at(it2) = rand() % 100;
    

    我想 assign 是我在这种情况下需要的函数,因为insert将添加新元素,或者 at 但我尝试的每件事都给了我一个错误,我不知道我还能尝试什么,或者我是否必须以不同的方式来思考。。。

    非常感谢!!

    3 回复  |  直到 7 年前
        1
  •  5
  •   Caleth    7 年前

    迭代器就像指针。最简单的就是分配 *it2 = rand() % 100 在您的循环中。

    使用 <algorithm>

    void fill_row(std::vector<int> & row)
    {
        std::generate(row.begin(), row.end(), [](){ return rand() % 100; }); 
    }
    
    void fill_matrix(std::vector<std::vector<int>> & mat)
    {
        std::for_each(mat.begin(), mat.end(), fill_row);
    }
    

    std::generate 为每个元素指定调用其函数参数的结果。

    std::for_each 使用每个元素调用其函数参数

        2
  •  3
  •   Ron Alan    7 年前

    我不认为您可以向向量构造函数提供一个随机值,并期望所有元素都具有随机值。相反,保留向量大小,然后通过取消引用适当的迭代器来分配随机值:

    #include <iostream>
    #include <vector>
    #include <random>
    #include <iomanip>
    
    int main() {
        std::random_device rd; 
        std::mt19937 gen(rd());
        std::uniform_int_distribution<> dis(1, 100);
        std::vector<std::vector<int>> Matrix(5, std::vector<int>(7, 0));
    
        for (auto it1 = Matrix.begin(); it1 != Matrix.end(); it1++) {
            for (auto it2 = it1->begin(); it2 != it1->end(); it2++) {
                *it2 = dis(gen); // dereference iterator, set the value
                std::cout << std::setw(4) << *it2;
            }
            std::cout << '\n';
        }
    }
    

    在这里 it1 表示行的迭代器,类型为: std::vector<std::vector<int>>::iterator it2 表示单个元素的迭代器,类型为 std::vector<int>::iterator .

        3
  •  1
  •   tema    7 年前

    如果我答对了您的问题,那么您正在寻找一种生成随机矩阵的方法(其中每个元素都是随机的)。
    以下是如何做到这一点:

    int num_rows = 5, num_cols = 7;
    // create Matrix filled with 0 (as you mentioned in Case1)
    std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, 0));
    // Iterating over each row
    for (auto it_row = Matrix.begin(); it_row != Matrix.end(); it_row++)
    {
        // Getting each (i,j) element and assigning random value to it
        for (auto it_col = it_row->begin(); it_col != it_row->end(); it_col++)
        {
            *it_col = rand() % 100;
        }
    }
    
    // let's print the Matrix
    for (auto it_row = Matrix.begin(); it_row != Matrix.end(); it_row++)
    {
        for (auto it_col = it_row->begin(); it_col != it_row->end(); it_col++)
        {
            std::cout << *it_col << " ";
        }
    
        std::cout << std::endl;
    }