Массив случайных чисел одинаков каждый раз

Я делаю векторную программу, которая должна производить 3 разных вектора каждый раз.

Это код, который я до сих пор:

Файл GenerateVector.h:

#ifndef Vector_GenerateVector_h
#define Vector_GenerateVector_h
#endif

#include <string>
#include <sstream>
#include <vector>
using namespace std;

class FourVector
{
int x, y, z, t;
public:
FourVector (int a, int b, int c, int d);
int getX() {return x;}
int getY() {return y;}
int getZ() {return z;}
int getT() {return t;}
};

FourVector::FourVector (int a, int b, int c, int d) {
x = a;
y = b;
z = c;
t = d;
}

string toString(FourVector vec) //get vector function
{
ostringstream s; //making a new string stream
s << "("<< vec.getX() << ", " << vec.getY() << ", " << vec.getZ() << ", " << vec.getT() << ")"; // append to string stream
string combinedString = s.str(); //cast string stream to a string
return combinedString; //return string.
}

FourVector genVector()
{
int x = rand() % 10;
int y = rand() % 10;
int z = rand() % 10;
int t = rand() % 10;

FourVector  v (x, y, z, t);

return v;
}

vector<FourVector> createArrayFourVectors()
{
vector<FourVector> vecs; //create array of threevectors.

for (int i = 0; i < 3; i++) {
FourVector v = genVector();
vecs.assign(i, v); // assign threevectors to the array to fill it up.
}
return vecs;
}

Файл main.cpp:

#include <iostream>
#include "GenerateVector.h"using namespace std;

int main(int argc, const char * argv[])
{

int seed = static_cast<int>(time(nullptr));
srand(seed);

vector<FourVector> v = createArrayFourVectors();

for (int i = 0; i < 3; i++) {
FourVector tv = v[i];
cout << toString(tv) << endl;
}
}

(5, 1, 4, 8)

(5, 1, 4, 8)

(0, 0, 0, 0)

Программа завершилась с кодом выхода: 0

1-я проблема: я не понимаю, почему вместо 3 получается только 2 вектора.

Вторая проблема: почему вектор № 1 и вектор № 2 всегда одинаковы? Я использовал srand () только один раз, в начале своей основной функции, и до сих пор у меня есть эта проблема. Я полагал, что мой компьютер был слишком быстрым для того времени, чтобы значительно измениться, чтобы произвести другой набор случайных чисел, но попытка вставить usleep (1000000) не имела никакого значения.

Любая помощь будет оценена!

1

Решение

Проблема в vecs.assign(i, v);, Эта форма assign берет целое число и объект и устанавливает вектор равным этому количеству копий объекта. У вас есть петля i принимая значения 0, 1 и 2, так что на последней итерации цикла вы будете устанавливать две копии вашего FourVector объект. Это означает, что первые два элемента vec будут идентичные копии, а длина вектора будет 2 и любая попытка получить доступ за пределами этого будет неопределенным поведением.

4

Другие решения

Это из-за неопределенное поведение. std::vector::assign функция заменяет существующий запись в векторе, но вектор пустой, поэтому вы пишете в несуществующую запись в векторе.

Простое решение? использование push_back вместо.

3

По вопросам рекламы [email protected]