在 C++ 中生成和存储随机数组

generating and storing random arrays in c++

本文关键字:存储 随机 数组 C++      更新时间:2023-10-16

我正在开发一个程序,该程序将初始数组作为输入,然后从初始数组随机生成 10 个随机数组。

我编写了一个函数来从初始数组生成单个随机数组。

但是,我无法开发在主函数中调用此函数并生成 10 个此类随机数组的代码。我还将使用这 10 个随机生成的数组在 main 函数中进行进一步计算。

由于我对C++的了解目前有限,因此我不知道使用向量进行动态分配。如果有人可以指导有关要在主函数中使用的代码,那将非常有帮助。

这里int initial[]是第一个使用int *newparents()函数生成其他 10 个随机数组的数组。当在 main 中调用newparents()函数时,它会返回一个随机洗牌的数组。

我会请求您通过调用newparents()函数然后在 main 函数中生成 10 个随机数组,然后存储它们以供进一步使用,从而帮助您生成 10 个随机数组。

法典:

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

谢谢你的帮助。

使用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数组本身并将其添加到向量向量中。

要使用代码创建指向随机数组的 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];

我编写了一个函数来从初始数组生成单个随机数组。

不,您编写了一个函数来就地洗牌初始数组,然后复制它。坦率地说,这有点奇怪,因为我不明白为什么要就地改变全局(在第一次调用函数后,全局数组仍然称为"初始",但不再处于初始状态(。

由于我对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";
}
}