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

时间:2016-02-18 05:31:02

标签: c++ arrays

我正在尝试创建许多数组,这些数组包含随机数和在1到20个元素范围之间的随机大小。我的代码适用于SOMETIMES。

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

  

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

“numbers”是数组的名称。这是我的代码的相关部分:

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

3 个答案:

答案 0 :(得分:1)

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

#define MAXL 20

int numbers[MAXL];

for ...
    int length = rand() % MAXL + 1;
    ...

此外,如果你正在实现冒泡排序,我认为内部i循环的条件应该是i&lt;长度 - j

答案 1 :(得分:0)

  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);
  3. 关于它。

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

答案 2 :(得分:0)

正如@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];