генерация и хранение случайных массивов в c ++ - PullRequest
0 голосов
/ 08 июня 2018

Я работаю над программой, которая принимает исходный массив в качестве входных данных, а затем случайным образом генерирует 10 случайных массивов из исходного массива.

Я написал функцию для генерации одного случайного массива из исходного массива..

Однако я не могу разработать код, который вызывает эту функцию в основной функции и генерирует 10 таких случайных массивов. Я также буду использовать эти 10 случайно сгенерированных массивов для дальнейшего вычисления в основной функции.

Поскольку мои знания C ++ на данный момент ограничены, я не знаю об использовании векторов для динамического выделения. Было бы очень полезно, если бы кто-нибудь мог рассказать о коде, который будет использоваться в основной функции.

Здесь int initial[] - первый массив, использованный для генерации 10 других случайных массивов с использованием функции int *newparents().Когда функция newparents() вызывается в main, она возвращает один случайно перемешанный массив.

Я бы запросил вашу помощь в создании 10 случайных массивов в основной функции, вызвав функцию newparents() и сохранив их для дальнейшего использования.использовать.

Код:

int initial[] =
{ 10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200 };
int size = sizeof(initial) / sizeof(initial[0]);

int *newparents()
{
    int *pt = new int[size];
    random_shuffle(&initial[0], &initial[size]);
    for (unsigned i = 0; i<size; i++)
    {
        pt[i] = initial[i];
    }
    return pt;
}

int main()
{
    int *p;
    p = newparents();
    cout << "p1=" << " ";
    for (int i = 0; i<size; i++)
    {
        cout << *(p + i) << " ";
    }
    return 0;
}

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Чтобы создать массив из 10 указателей на перемешанные массивы, используя ваш код, вы можете просто:

int *arr[10];
for (int i = 0; i < 10; ++i)
    arr[i] = newparents();

int *arr[10]; создаст массив из 10 указателей на int, то есть то, что ваш newparents(); функция возвращает указатель на первый int перетасованного массива.

Поскольку вы выделили эти массивы в кучу, убедитесь, что вы освободили эту память, как только закончили с ними:

for (int i = 0; i < 10; ++i)
    delete[] arr[i];
0 голосов
/ 08 июня 2018

Я написал функцию для генерации одного случайного массива из исходного массива.

Нет, вы написали функцию, чтобы перетасовать начальный массив на место и затем скопировать его.Откровенно говоря, это немного странно, потому что я не понимаю, почему вы хотите изменить глобальное место (после первого вызова вашей функции глобальный массив все еще называется «начальным», но больше не находится в своем исходном состоянии).).

Поскольку мои знания C ++ на данный момент ограничены, я не знаю, как использовать векторы для динамического выделения.

Суть в том, что std::vector обрабатываетвсе выделение для вас, избегая утечек памяти и ручного копирования в вашем текущем коде.

Если вы потратите время на правильное использование C ++, вместо того, чтобы пытаться писать C на C ++, код будет довольно тривиальным:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

// let's avoid mutating our global state
const std::vector<int> Seeds =
{10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200};

// this shuffles a copy of the argument passed
std::vector<int> shuffle(std::vector<int> v) {
    std::random_shuffle(begin(v), end(v));
    return v;
}

// return n independently-shuffled copies of "initial"
std::vector<std::vector<int>> shuffle_n(size_t n,
                                        std::vector<int> const& initial) {
    std::vector<std::vector<int>> result(n);
    std::generate_n(begin(result), n,
                    [&initial]() {
                        return shuffle(initial);
                    });
    return result;
}

int main() {
    // one line to create 10 shuffled vectors
    auto allparents = shuffle_n(10, Seeds);

    // and one loop to print them all
    for (auto &v : allparents) {
        std::cout << '{';
        std::copy(begin(v), end(v),
                  std::ostream_iterator<int>(std::cout, " "));
        std::cout << "}\n";
    }
}
0 голосов
/ 08 июня 2018

Простой способ сделать это, используя std::vector:

#include <iostream>
#include <vector>
#include <algorithm>

std::vector< std::vector<int> >
GenerateRandomArrays( std::vector<int> const & inInitialArray, int inNumberOfArrays)
{
    std::vector<std::vector<int> > generatedArrays;
    std::vector<int> tempArray(inInitialArray);
    for (int i = 0; i < inNumberOfArrays; i++)
    {
        std::random_shuffle(tempArray.begin(), tempArray.end());
        generatedArrays.push_back(tempArray);
    }
    return generatedArrays;
}

int main() {
    // Creates the initial array.
    std::vector<int> initial{ 10,20,30,40,50 };
    auto blah = GenerateRandomArrays(initial, 10);
    return 0;
}

Вывод:

50  20  40  30  10
50  40  30  10  20
20  10  30  50  40
30  40  20  10  50
30  50  20  10  40
20  50  10  40  30
50  30  20  10  40
30  40  20  10  50
20  10  50  40  30
20  50  10  40  30

Примечание: Я создаю новый tempArrayтолько потому, что я думаю, что вы не хотите изменять вектор intial.Если это не так, то вы можете просто перемешать сам массив initial и добавить его к вектору векторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...