在c ++

时间:2016-04-13 17:28:06

标签: c++ random srand

我正在尝试为我的“最小点积”问题创建一些测试用例。我想要10个测试用例,每个测试用例为向量a和b生成不同的值集。

问题在于,即使在使用srand( time( NULL ) )之后,每次编译和运行代码时都会生成新输入,但所有10个测试用例都使用相同的输入。

#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

using std::vector;

void sort_asc(vector<int> &manav, int sizes)
{
    int temp = 0;

    for (int i = 0; i<sizes; i++)
    {

        for (int j = i + 1; j<sizes; j++)
        {

            if (manav[i] > manav[j])
            {

                temp = manav[i];
                manav[i] = manav[j];
                manav[j] = temp;

            }
        }
    }

    std::cout << "b in asc order : ";
    for (int i = 0; i<sizes; i++)
    {
        std::cout << manav[i] << " ";

    }

    std::cout << std::endl;

}

void sort_desc(vector<int> &manav, int sizes)
{
    int temp = 0;

    for (int i = 0; i<sizes; i++)
    {

        for (int j = i + 1; j<sizes; j++)
        {

            if (manav[i] < manav[j])
            {

                temp = manav[i];
                manav[i] = manav[j];
                manav[j] = temp;

            }
        }

    }

    std::cout << "a in desc : ";
    for (int i = 0; i<sizes; i++)
    {
        std::cout << manav[i] << " ";

    }
    std::cout << std::endl;

}

long long min_dot_product(vector<int> a, vector<int> b, int sizes) {

    long long result = 0;

    sort_desc(a, sizes);

    sort_asc(b, sizes);


    for (size_t i = 0; i < sizes; i++) {
        result += a[i] * b[i];
    }
    return result;
}

int main() {

    srand(time(NULL));
    /*
    std::cin >> n;
    vector<int> a(n), b(n);
    for (size_t i = 0; i < n; i++) {
    std::cin >> a[i];
    }
    for (size_t i = 0; i < n; i++) {
    std::cin >> b[i];
    }
    */

    //================================================================ TESTING =========================================================================
    int z = 0;
    int n = (rand() % 10) + 1; // generating the size of the vectors [1-10]
    std::cout << "n = " << n << "\n";
    vector<int> a;
    vector<int> b;

    while (z != 10) {

        for (int i = 0; i < n; ++i)
        {
            int p = (rand() % 10) - 5;
            a.push_back(p); // input values [-5,4] in 'a'

        }

        std::cout << "Unsorted Vector a = ";
        for (int i = 0; i<n; i++)
        {
            std::cout << a[i] << " ";
        }

        std::cout << std::endl;

        for (int i = 0; i < n; ++i)
        {
            int q = (rand() % 10) - 5;
            b.push_back(q); // inputing values [-5,4] in 'b'

        }

        std::cout << "Unsorted Vector b = ";
        for (int i = 0; i<n; i++)
        {
            std::cout << b[i] << " ";
        }

        std::cout << std::endl;

        std::cout << "min_dot_product = " << min_dot_product(a, b, n) << std::endl;
        z++;

    }

    return 0;
}

每次运行代码时,我都想为所有10个测试用例生成一组不同的向量a和b值。

我在各个for循环中尝试了srand(i),然后在向量中推送值,但它对我不起作用,在for循环中重用srand( time( NULL ) )也不会有帮助。还有其他一些简单的方法可以达到这个目的吗?

1 个答案:

答案 0 :(得分:1)

问题是你永远不会在每次迭代中清除向量。由于您不会将生成的所有新随机数添加到向量的末尾,因此n永远不会更改,因此您会忽略它们。

您需要做的是添加

a.clear();
b.clear();

到while循环结束。这将清除向量,然后当你开始下一次迭代时,新的随机数将被添加到你在函数中使用的向量部分。

您还可以将矢量设置为适当的大小,然后使用[]来访问元素。这样您就可以覆盖以前的值,而不必调用clear()

vector<int> a(n);
vector<int> b(n);
//...
for (int i = 0; i < n; ++i)
{
    a[i] = (rand() % 10) - 5;
    b[i] = (rand() % 10) - 5;
}

我将两个赋值放在同一个for循环中以节省空间。您可以在两个单独的循环中执行此操作,但不需要它。