Перемешать 2D вектор за столбцом - PullRequest
0 голосов
/ 24 января 2020

Мой текущий код перетасовывает 2d вектор за строкой, но теперь я хочу перетасовать вектор за столбцом. Мне нужно делать их по одному, чтобы сохранить определенное свойство (свойство n-rooks в многоструйной выборке).

Я знаю, что это кажется тривиальным вопросом, который, вероятно, задавался бесчисленное количество раз, но Я потратил последние 40 минут, пытаясь найти его в Google, и, по-видимому, мои навыки в Google: tra sh.

Спасибо.

#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

1 Ответ

2 голосов
/ 24 января 2020

Один из способов - перемешать каждый внутренний вектор с помощью одного и того же «случайного» движка

#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;
}
...