如何用随机值初始化C++二维std::vector矩阵?
如何用随机数正确初始化二维std::vector矩阵
我来帮你解决这个二维vector随机初始化的问题,先理清楚你遇到的两个核心问题,再给出几种靠谱的解决方案:
为什么你的Case 2会得到全相同的随机数?
你写的std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, rand()%100));之所以会让整个矩阵都是同一个随机数,是因为std::vector的这个构造函数接受的是一个已经构造好的元素副本:
- 首先
rand()%100会被执行一次,得到一个固定值(比如你说的34); - 然后所有的行vector都是这个初始
std::vector<int>(num_cols, 34)的拷贝; - 最终整个矩阵的所有元素都会是这个初始值。
迭代器循环的正确赋值方式
你之前用迭代器遍历的时候,错误地尝试用assign(这个函数是用来替换整个容器的内容,不是单个元素),或者把迭代器当成下标来用(比如Matrix[it1][it2],it1是迭代器不是整数下标)。正确的做法是直接解引用迭代器来赋值,就像你打印元素时的逻辑一样:
// 先初始化全0矩阵 int num_rows=5, num_cols=7; std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, 0)); // 用迭代器遍历并赋值随机数 for (std::vector<std::vector<int>>::iterator row_it = Matrix.begin(); row_it != Matrix.end(); ++row_it) { for (std::vector<int>::iterator col_it = row_it->begin(); col_it != row_it->end(); ++col_it) { // 直接解引用迭代器,给单个元素赋值 *col_it = rand() % 100; } }
更简洁的写法(C++11及以后版本)
如果你的编译器支持C++11或更高版本,推荐用范围for循环,代码更简洁易读,还能避免迭代器的语法繁琐:
int num_rows=5, num_cols=7; std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols)); for (auto& row : Matrix) { for (auto& elem : row) { elem = rand() % 100; } }
另外,也可以用std::generate函数直接生成每行的随机元素,不需要先初始化全0:
#include <algorithm> // 必须包含这个头文件用于std::generate int num_rows=5, num_cols=7; std::vector<std::vector<int>> Matrix(num_rows); for (auto& row : Matrix) { row.resize(num_cols); // 用lambda表达式作为生成器,每次调用返回一个随机数 std::generate(row.begin(), row.end(), [](){ return rand() % 100; }); }
进阶:更专业的随机数生成方案(C++11+)
rand()是C语言遗留的随机数生成函数,存在随机质量差、分布不均匀的问题。C++11以后推荐用<random>库的工具,生成的随机数更可靠:
#include <random> int num_rows=5, num_cols=7; // 初始化随机数生成器 std::random_device rd; std::mt19937 gen(rd()); // 定义0到99的均匀分布 std::uniform_int_distribution<> dist(0, 99); std::vector<std::vector<int>> Matrix(num_rows); for (auto& row : Matrix) { row.resize(num_cols); std::generate(row.begin(), row.end(), [&](){ return dist(gen); }); }
内容的提问来源于stack exchange,提问作者Megasa3
相关产品推荐
相关产品推荐

