按列打乱二维向量
Shuffle 2D vector by column
我当前的代码按行打乱二维向量,但现在我想按列打乱向量。我需要一次做一个,以保留某个 属性(多重抖动采样中的 n-rooks 属性)。
我知道这似乎是一个可能被问过无数次的微不足道的问题,但我花了最后 40 分钟试图 google 它,显然我的 google 技能很垃圾。
谢谢。
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>
int main()
{
std::vector<std::vector<int>> v { {1,4,7}, {2,5,8}, {3,6,9} };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << v[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
shuffle(v.begin(),v.end(), std::default_random_engine(seed));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << v[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
输出:
1 4 7
2 5 8
3 6 9
3 6 9
1 4 7
2 5 8
一种方法是使用相同的 "random" 引擎打乱每个内部向量
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>
int main()
{
std::vector<std::vector<int>> v { {1,4,7}, {2,5,8}, {3,6,9} };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << v[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
for (auto &inner : v) {
shuffle(inner.begin(),inner.end(), std::default_random_engine(seed));
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << v[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
我当前的代码按行打乱二维向量,但现在我想按列打乱向量。我需要一次做一个,以保留某个 属性(多重抖动采样中的 n-rooks 属性)。
我知道这似乎是一个可能被问过无数次的微不足道的问题,但我花了最后 40 分钟试图 google 它,显然我的 google 技能很垃圾。
谢谢。
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>
int main()
{
std::vector<std::vector<int>> v { {1,4,7}, {2,5,8}, {3,6,9} };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << v[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
shuffle(v.begin(),v.end(), std::default_random_engine(seed));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << v[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
输出:
1 4 7
2 5 8
3 6 9
3 6 9
1 4 7
2 5 8
一种方法是使用相同的 "random" 引擎打乱每个内部向量
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>
int main()
{
std::vector<std::vector<int>> v { {1,4,7}, {2,5,8}, {3,6,9} };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << v[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
for (auto &inner : v) {
shuffle(inner.begin(),inner.end(), std::default_random_engine(seed));
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << v[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}