在多次迭代中创建随机大小(在特定范围内)的数组

Create randomly sized (within a certain range) arrays over many iterations

本文关键字:范围内 数组 迭代 随机 创建      更新时间:2023-10-16

我正在尝试创建许多由随机数和随机大小组成的数组,例如,1 到 20 个元素的范围。我的代码有时有效。

我在所需范围之间使用随机数来确定数组大小。例如,如果第一次迭代产生的数组大小为 10,那么出于某种原因,我的代码不想创建任何大于 10 的数组。将创建各种数组(并将输出这些数组的列表),直到某个迭代产生大于 10 的随机数。然后我得到这个错误:

数组索引超出范围的数字->[11] 有效数字[9]

"数字"是数组的名称。这是我代码的相关部分:

srand(time(0));
int j, flag = 0;
int temp;
int rand=1;
for(int t=0; t<50; t++)
{
    int length = rand()% 20 + 1;
    cout<<"length is " << length << endl;
    int numbers[length];
    for(int i = 0; i < length; i++)
    {
        numbers[i]=rand();
        cout << numbers[i] << endl;
    }
    for(j=0; (j<=length); j++)
    {
        for (int i=0; i<(length-1); i++)
        {
            if(numbers[i+1]<numbers[i])
            {
                temp=numbers[i];
                numbers[i]=numbers[i+1];
                numbers[i+1]=temp;
                flag++;
            }
        }
    }
    cout << "Number of Swaps : " << flag << endl;
}

正如@Bob__所写,分配可变长度数组并不是C++标准。它有时可能适用于特定的编译器,但可能会在其他编译器上中断。

但是有很好的选择。您可以使用 new 分配动态内存。例如:

int *array = new int[size];
array[0] = 3;
array[1] = 5;
cout << array[1];
delete [] array;

不要忘记事后删除带有delete的内存。

或者您可以使用vector<int>.这是一个STL容器,正是为此目的而制造的。

#include <vector>
using namespace std;
...
vector<int> vec(size);
vec[0] = 3;
vec[1] = 5;
cout << vec[1];

可变长度数组不是C++标准,而只是由一些编译器作为扩展提供。我不会相信他们,你的代码中真的不需要这样的东西。您可以在外部 for 循环之外声明数组,因为您知道它的最大长度:

#define MAXL 20
int numbers[MAXL];
for ...
    int length = rand() % MAXL + 1;
    ...

此外,如果您正在实现气泡排序,我认为内部 i 循环的条件应该是 i

  1. rand用于两种上下文。作为变量int rand和函数std::rand()。我建议删除任何using namespace std;但由于无论如何都不需要该变量,您也可以删除int rand = 1;.请注意,rand() 是一个 C 函数。你可以使用它,但恕我直言,std::rand()更纯粹C++。
  2. int numbers[length];不会编译,因为length是非常量。请改用std::vector<int> numbers(length);

仅此而已。

#include <iostream>
#include <vector>
#include <time.h>
int main()
{
    std::srand(time(0));
    int j, flag = 0;
    int temp;
    for (int t = 0; t < 50; t++)
    {
        int length = std::rand() % 20 + 1;
        std::cout << "length is " << length << std::endl;
        std::vector<int> numbers(length);;
        for (int i = 0; i < length; i++)
        {
            numbers[i] = std::rand();
            std::cout << numbers[i] << std::endl;
        }
        for (j = 0; (j <= length); j++)
        {
            for (int i = 0; i < (length - 1); i++)
            {
                if (numbers[i + 1] < numbers[i])
                {
                    temp = numbers[i];
                    numbers[i] = numbers[i + 1];
                    numbers[i + 1] = temp;
                    flag++;
                }
            }
        }
        std::cout << "Number of Swaps : " << flag << std::endl;
    }
}