2016-04-13 5 views
1

「最小ドット製品」問題のテストケースをいくつか作成しようとしています。私はベクトルaとベクトルbの両方に対して異なる値の集合を生成する10個のテストケースが必要です。C++でsrand()を使用するテストケースの新しい値のセット

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(time(NULL))をforループ内で再利用することは役に立ちません。私はこれを達成することができる他の簡単な方法はありますか?

答えて

1

問題は、各繰り返しでベクトルを決してクリアしないということです。 nは決して変更されないので、生成する新しい乱数のすべてがベクトルの最後に追加されるわけではないので無視します。あなたがする必要がどのような

は、whileループの最後に

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

を追加することです。これによりベクトルが消去され、次の反復を開始すると、関数内で使用するベクトルの部分に新しい乱数が追加されます。

また、ベクターに適切なサイズを設定し、[]を使用して要素にアクセスすることもできます。この方法は、あなただけの以前の値を上書きすると、あなたは私がスペースを節約するために、forループと同じで、両方の割り当てを入れ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; 
} 

を呼び出す必要はありません。これを2つの別々のループで行うことはできますが、必要ではありません。

関連する問題