Я работаю над программой, которая принимает начальный вектор как inpit. Этот вектор является вектором размера 20. Затем программа генерирует 10 случайных векторов из этого вектора. Для этой цели я выбираю 2 индекса выкупа в начальном векторе и меняю их местами с друг друга для генерации нового вектора. Это делается для генерации всех 10 новых векторов. Созданные 10 новых векторов должны быть сохранены в следующем двумерном векторе.
vector<vector<int>> allparents
Мне удалось сгенерировать 2 случайных числа индекса с помощью функции srand (), а затем поменять местами элементы с этими индексами на начальный вектор. Однако я не могу сгенерировать 10 таких случайных родителей, а затем сохранить их в 2D-векторе allparents. Мой код выглядит следующим образом:
#include<vector>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<ctime>
using namespace std;
int main () {
srand(time(NULL));
int i1=(rand()%19+1);
int i2=(rand()%19+1);
cout<<i1<<endl;
cout<<i2<<endl;
vector<int> initial = {71,127,428,475,164,253,229,395,92,189,41,110,443,490,278,305,28,58,371,560};
vector<vector<int>> allparents;
for(int r=0;r<10;r++){
for(int c=0;c<20;c++){
swap(initial[i1],initial[i2]);
allparents[r][c]=initial[c];
cout<<allparents[r][c]<" "<<endl;
}
}
return 0;
}
Поскольку я новичок в векторах, я прошу вашей помощи в этой программе. Спасибо.
@KarstenKoop Да, я уверен, мне нужен вектор, содержащий 10 других векторов. Каждый вектор из этих 10 векторов должен содержать 20 элементов.
да, но теперь у вас есть массив массивов векторов векторов, это делает его 4-тусклым, а не 2-тусклым. Чтобы создать вектор размером 20, используйте не std::vector v[20], а std::vector v(20).
i1 и i2 постоянны внутри цикла for, поэтому вызов swap просто меняет их местами взад и вперед. вызов rand() должен быть внутри цикла.
rand()%19+1 - это способ (старый и немного предвзятый) для генерации псевдослучайных чисел в диапазоне [1, 19]. Это ваше намерение? пропустить индекс 0? Могу я предложить вам сделать правильный отступ в коде? Это очень простой способ отловить распространенные ошибки.
Извините, это была ошибка в коде, я не собираюсь пропускать индекс 0
@Bob__Код был с отступом





Прежде всего, я бы не сказал, что вы «генерируете случайные векторы», вы просто перетасовываете заранее определенный. Во-вторых, я предлагаю создать небольшие рабочие функции и собрать вашу программу с такими:
vector<int> shuffle(vector<int> v) {
// Use the implementation you want here, I will use a std algorithm
static auto rng = std::default_random_engine {};
std::shuffle(std::begin(v), std::end(v), rng);
return v; // this is a copy of the vector
}
int main() {
vector<int> initial= {
71,127,428,475,164,253,229,395,92,189,41,110,443,490,278,305,28,58,371,560
};
// Generate 10 shuffled vectors
vector<vector<int>> shuffledVectors;
for (int i = 0; i < 10; i++) {
vector<int> shuffled = shuffle(initial);
shuffledVectors.push_back(shuffled);
}
// Print them
for (vector<int>& v : shuffledVectors) {
for (int& i : v)
cout << i << " ";
cout << endl;
}
return 0;
}
Выход:
164 41 110 305 278 28 58 127 229 189 475 395 560 428 71 443 253 371 490 92
490 71 305 58 428 127 28 110 92 443 189 229 278 475 371 395 560 41 253 164
395 278 560 490 28 164 71 229 58 41 428 305 127 253 475 371 92 189 110 443
164 475 92 253 229 189 127 560 71 58 41 443 428 395 371 490 110 278 28 305
443 253 428 110 278 71 475 127 58 41 371 229 305 189 395 164 28 490 92 560
560 28 58 71 229 41 490 475 189 443 253 395 305 164 371 278 428 92 110 127
395 443 371 58 253 305 92 127 475 110 428 229 189 41 164 278 71 560 28 490
278 189 71 127 443 110 28 428 305 560 371 58 229 253 395 164 41 490 475 92
28 395 92 443 560 278 371 71 58 305 475 253 428 490 229 189 164 110 41 127
443 71 428 229 127 278 490 58 475 253 164 110 92 189 395 560 305 41 28 371
Пожалуйста, не предлагайте std::random_shuffle, это был устарело в C++ 14 и удалено в C++ 17. std::shuffle был бы лучше, но в случае OP даже изобретать колесо может быть достаточно.
vector<vector<int>> allparents[10][20];- это 2dim-массив векторов векторов, поэтому в итоге получается 4 измерения. Вы уверены, что это то, что вам нужно?