按列随机排列2D向量

问题描述 投票:0回答:1

我当前的代码按行对2d向量进行随机排列,但是现在我想按列对向量进行随机排列。我需要一次做一次,以保留某个属性(多抖动采样中的n-rooks属性)。

[我知道这似乎是一个琐碎的问题,可能已经问了无数次,但是我花了最后40分钟尝试对它进行搜索,显然我的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
c++ vector 2d shuffle
1个回答
1
投票

一种方法是使用相同的“随机”引擎对每个内部向量进行混洗

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.