在c++中变换向量的向量

Shuffle vector of vectors in C++

本文关键字:向量 变换 c++      更新时间:2023-10-16

考虑vector<vector<int> > Vec

我想对Vec中每个vector<int>中的int值进行洗牌,并对vector< vector<int> >进行洗牌。

我如何在c++中做到这一点?

我的主要目标是随机化一个整数矩阵,我已经使用vector<vector<int> > Vec实现了。

当前,我正在尝试这样做:

unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
for(int i=0;i<Vec.size();i++) {
    shuffle(Vec[i].begin(), Vec[i].end(), std::default_random_engine(seed));
}
shuffle(Vec.begin(),Vec.end()); 
// gives an error: 
cluster.cpp:36:27: error: no matching function for call to ‘shuffle(std::vector<std::vector<int> >::iterator, std::vector<std::vector<int> >::iterator)’

可以使用shuffle操作随机洗牌数组中的元素。你可以用两次这个来随机化这个数组。然而,它留下的问题是,数字在一行中被洗牌,行也被洗牌。这不是一个完全随机的洗牌,因为约束仍然存在。

为了获得真正的随机洗牌,我建议您将矩阵复制到一维向量中,洗牌该向量,然后将其重塑为矩阵。

变换向量的代码如下

#include <algorithm>
#include <random>
auto engine = std::default_random_engine{};
std::shuffle(std::begin(vector), std::end(vector), engine);