2017-09-14 8 views
-2

Ich schreibe ein Programm, das zwei Vektoren mit zufälligen Ints (weniger als 1000) mit 2 verschiedenen gesetzten Listen füllen muss. wenn ich versuche, srand mit den samen zu verwenden, die ich verwenden soll, bekomme ich eine sehr seltsame ausgabe.srand funktioniert nicht richtig

hier ist der Code ich so weit ...

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 

void Vectors(vector <int> v1, vector <int> v2, int s1, int s2) { 
    srand(s1); 
    for (int i = 0; i < 200; i++) { 
     v1.push_back(rand() % 1000 + 1); 
     //v1[i] = rand() % 1000 + 1; 
    } 
    srand(s2); 
    for (int i = 0; i < 100; i++) { 
     v2.push_back(rand() % 1000 + 1); 
     //v2[i] = rand() % 1000 + 1; 
    } 
} 

void prnt(vector<int> v) { 
    for (int i = 0; i < 20; i++) { 
     cout << v[i] << " "; 
     if (i == 9 || i == 19) { 
      cout << endl; 
     } 
    } 
} 

int main() { 
    vector<int> vec1; 
    vector<int> vec2; 
    vec1.resize(200); 
    vec2.resize(100); 
    Vectors(vec1, vec2, 1, 3); 
    prnt(vec1); 
    prnt(vec2); 
    return 0; 
    system("pause"); 
} 

jedoch geschrieben habe, wenn ich es die Ausgabe bekomme ich diese laufen ... auch

0  29046  -309340552  29046  32  0  134113 0 0 0 
-309339528  29046  64  0 48 0 0 0 986 169 
0 0 -309340552 29046 32 0 134113 0 0 0 
-309339528 29046 64 0 48 0 0 0 986 169 

ist, wird es erlaube mir nicht, die Vectors-Methode zu verwenden, wenn vec1 und 2 nicht auf eine bestimmte Größe initialisiert sind.

ich von Java nach C nur übertragen haben ++ so dass jede Hilfe Sie mir wird anbieten können sehr geschätzt, da es sich auf etwas so trivial in Java

+2

Off topic, aber warum put 'system (" pause ");' nach 'return 0;'? – Amadeus

+0

Es gibt 2 Möglichkeiten, mit Vektoren umzugehen. Sie können die Größe ändern, indem Sie N Elemente zuweisen, die Sie als 'v [0] .. v [v.size() - 1]' adressieren können, oder Sie können 'push_back' verwenden, um die Größe um eins zu vergrößern und füge das neue Element am Ende hinzu. Was Sie jetzt tun, ist die Zuweisung von Platz für 200 Elemente, dann Hinzufügen von 200 mehr am Ende, was wahrscheinlich nicht das ist, was Sie tun möchten. –

+1

Manchmal können Fehler dein Leben retten. Es ist Zeit aufzuhören, 'rand()' zusammen zu verwenden und zu modernen C++ - Zufallsgeneratoren zu wechseln. – CroCo

Antwort

3
void Vectors(vector <int> v1, vector <int> v2, int s1, int s2) { 

Sie vorbei in den Vektoren festzustecken ist aufreizend nach Wert und nicht nach Referenz, so dass Sie Kopien, nicht die Originale ändern. sie durch Verweis

Stattdessen übergeben:

void Vectors(vector <int> & v1, vector <int> & v2, int s1, int s2) { 

und Sie werden die ursprünglichen Vektoren werden zu ändern, und Sie werden Ihre Änderungen außerhalb der Funktion sehen.

0

Ihre Ausgabe scheint falsch zu sein!

resize sollte Wert auf 0 setzen. Visual Studio 2017 tut und soweit ich weiß, ist dies das erwartete Verhalten aus dem Standard.

Das obige Programm sollte 4 Reihen von fünf 0.

Vectors hat keinen Einfluss außerhalb von selbst drucken hat es eine Kopie erstellen und die Kopie ändern (wie in früheren Antwort schon gesagt).

Wenn Sie jedoch prnt aufrufen, ist die Kopie nur einige Effizienzverschwendung, aber Sie sollten die gleichen Werte wie in main drucken. Dennoch ist es keine gute Idee, 20 Zahlen zu drucken, ohne sicherzustellen, dass Sie sie haben. Es macht den Code fragil ... wie man sicherstellen muss, dass genug Elemente hinzugefügt wurden.

Nachdem das gesagt wurde, ist Ihre Vectors Funktion ein schlechtes Design.

  • Erstens ist der Name bedeutungslos.
  • Zweitens ist der Code wiederholbar. Es wäre also viel besser, eine Funktion zu haben, die 1 Vektor aus einem gegebenen Zufallssatz zufällig zufügt. Erfahren Sie mehr über DRY-Prinzip.
  • Drittens dauert es eine Kopie von Vektoren Sie es hauptsächlich nur Zeit verschwenden.

Einige Nebennoten:

  • Wie schon gesagt, von jemandem, Sie zu modern Zufallsgenerator verwenden soll.
  • Verwenden Sie entweder reserve oder aktualisieren Sie vorhandene Elemente, anstatt neue hinzuzufügen.Es macht keinen Sinn, den Vektor mit 200 Nullen zu füllen und dann am Ende 200 zusätzliche Zufallszahlen hinzuzufügen.