2016-04-13 13 views
1

Ich versuche, einige Testfälle für mein 'minimum dot product' Problem zu erstellen. Ich möchte 10 Testfälle, die jeweils unterschiedliche Werte für Vektor a und b erzeugen.Neue Menge von Werten für Testfälle, die srand() in C++ verwenden

Das Problem ist, dass auch nach der Verwendung srand(time(NULL)) obwohl eine neue Eingabe jedes Mal generiert wird, wenn ich den Code kompilieren und ausführen, aber dass der gleiche Eingang für alle 10 Testfälle verwendet wird.

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

Ich möchte irgendwie einen anderen Satz von Werten für Vektor a und b für alle 10 Testfälle jedesmal, wenn ich den Code ausführen generieren.

Ich habe versucht srand(i) innerhalb der jeweiligen for-Schleifen vor dem Drücken der Wert in Vektoren, aber es funktioniert nicht für mich, auch die Wiederverwendung srand(time(NULL)) innerhalb der for-Schleifen wird auch nicht helfen. Gibt es eine andere einfache Möglichkeit, dies zu erreichen?

Antwort

1

Das Problem besteht darin, dass Sie den Vektor bei jeder Iteration niemals löschen. Da Sie nicht alle der neuen Zufallszahlen, die Sie generieren, am Ende des Vektors hinzugefügt werden, ignorieren Sie sie, da sich n niemals ändert.

Was Sie tun müssen, ist

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

bis zum Ende der while-Schleife hinzufügen. Dadurch werden die Vektoren gelöscht und wenn Sie die nächste Iteration starten, werden die neuen Zufallszahlen in den Teil des Vektors eingefügt, den Sie in Ihren Funktionen verwenden.

Sie könnten auch den Vektor die richtige Größe einstellen und dann [] verwenden, um auf die Elemente zuzugreifen. Auf diese Weise würden Sie nur die vorherigen Werte überschreiben und Sie würden nicht 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; 
} 

Ich habe beide Aufgaben in der gleichen for-Schleife um Platz zu sparen zu verlangen. Sie können dies in zwei separaten Schleifen tun, aber es ist nicht erforderlich.