Перестановка векторов в C++

Я работаю над программой, которая принимает начальный вектор как 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;
}

Поскольку я новичок в векторах, я прошу вашей помощи в этой программе. Спасибо.

vector<vector<int>> allparents[10][20]; - это 2dim-массив векторов векторов, поэтому в итоге получается 4 измерения. Вы уверены, что это то, что вам нужно?
Karsten Koop 19.06.2018 10:19

@KarstenKoop Да, я уверен, мне нужен вектор, содержащий 10 других векторов. Каждый вектор из этих 10 векторов должен содержать 20 элементов.

avi 19.06.2018 10:21

да, но теперь у вас есть массив массивов векторов векторов, это делает его 4-тусклым, а не 2-тусклым. Чтобы создать вектор размером 20, используйте не std::vector v[20], а std::vector v(20).

Karsten Koop 19.06.2018 10:23
i1 и i2 постоянны внутри цикла for, поэтому вызов swap просто меняет их местами взад и вперед. вызов rand() должен быть внутри цикла.
Karsten Koop 19.06.2018 10:25
rand()%19+1 - это способ (старый и немного предвзятый) для генерации псевдослучайных чисел в диапазоне [1, 19]. Это ваше намерение? пропустить индекс 0? Могу я предложить вам сделать правильный отступ в коде? Это очень простой способ отловить распространенные ошибки.
Bob__ 19.06.2018 10:37

Извините, это была ошибка в коде, я не собираюсь пропускать индекс 0

avi 19.06.2018 10:39

@Bob__Код был с отступом

avi 19.06.2018 10:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
1 405
1

Ответы 1

Прежде всего, я бы не сказал, что вы «генерируете случайные векторы», вы просто перетасовываете заранее определенный. Во-вторых, я предлагаю создать небольшие рабочие функции и собрать вашу программу с такими:

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 даже изобретать колесо может быть достаточно.

Bob__ 19.06.2018 11:13

Другие вопросы по теме