2016-04-08 2 views
0

Мой класс содержит некоторый вектор матрицы типа:Случайные генерируется вектор в C++ не изменяет значения

typedef std::vector<double> MyArray; 
typedef std::vector<MyArray> MyMatrix; 

Класс имеет update() метод, и на каждом вызове его нужно сгенерировать новую случайную матрицу, и старое место в std::map<double, MyMatrix, std::greater<double>> rankedMyMatrix_;.

метод обновления выглядит примерно так:

void MyClass::update(...){ 
    ... 
    this->generateMyMatrix(); // Generates new random currentMyMatrix_ 
    ... 
    rankedMyMatrix_.insert({matrixRank_, currentMyMatrix_}); 
    ... 
} 

Метод generateMyMatrix() выглядит следующим образом:

void MyClass::generateMyMatrix(){ 
    std::random_device rd; 
    std::mt19937 mt(rd()); 
    std::uniform_real_distribution<double> dist(-1, 1); 
    for (int i = 0; i < noMotors_; i++) { 
     MyArray array(MaxArraySamples, 0); 
     for (int j = 0; j < MaxArraySamples; j = j + steps) { 
      array[j] = dist(mt); 
     } 
    currentMyMatrix_.push_back(array); 
    } 
} 

Проблема заключается в том, что на каждом нажатии на rankedMyMatrix_ карте, на новом update() он создает ту же матрицу. Или это не пишет? Наверное, я здесь что-то пропустил, поэтому любая помощь будет оценена.

UPDATE

Вот код, который может быть собран и протестирован:

#include <iostream> 
#include "MyClass.h" 

using namespace std; 

int main() { 

    MyClass* c; 
    c = new MyClass(); 

    int x = 0; 

    while (x<3){ 
     c->update(); 
     x++; 
    } 

    return 0; 
} 

Заголовочный файл:

#ifndef PROBA_MYCLASS_H 
#define PROBA_MYCLASS_H 

#include <vector> 
#include <map> 

typedef std::vector<double> MyArray; 
typedef std::vector <MyArray> MyMatrix; 

const int NoMotors = 4; 
const int MaxArraySamples = 10; 

class MyClass { 
public: 
    MyClass(); 

    ~MyClass(); 

    void update(); 

private: 
    std::map<double, MyMatrix, std::greater<double>> rankedMyMatrix_; 

    MyMatrix currentMyMatrix_; 
    int matrixRank_; 

    void generateMyMatrix(); 

    void writeCurrent(); 

}; 

#endif //PROBA_MYCLASS_H 

Класс файла:

#include "MyClass.h" 

#include <random> 
#include <iostream> 
#include <fstream> 

MyClass::MyClass() { 
    currentMyMatrix_.reserve(NoMotors); 
    matrixRank_ = 0; 
} 

MyClass::~MyClass() { } 

void MyClass::update() { 

    this->generateMyMatrix(); // Generates new random currentMyMatrix_ 

    rankedMyMatrix_.insert({matrixRank_, currentMyMatrix_}); 
    matrixRank_++; 

    this->writeCurrent(); 
} 

void MyClass::generateMyMatrix() { 
    std::random_device rd; 
    std::mt19937 mt(rd()); 
    std::uniform_real_distribution<double> dist(-1, 1); 
    for (int i = 0; i < NoMotors; i++) { 
     MyArray array(MaxArraySamples, 0); 
     for (int j = 0; j < MaxArraySamples; j = j + 3) { 
      array[j] = dist(mt); 
     } 
     currentMyMatrix_.push_back(array); 
    } 
} 

void MyClass::writeCurrent() { 
    std::ofstream outputFile; 
    std::string uri = "/tmp/output/test"; 
    outputFile.open(uri + std::to_string(matrixRank_) + ".txt"); 
    for (int i = 0; i < MaxArraySamples; i++) { 
     for (int j = 0; j < NoMotors; j++) { 
      outputFile << currentMyMatrix_[j][i] << " "; 
     } 
     outputFile << std::endl; 
    } 
    outputFile.close(); 
} 

И CMakeLists.txt :

cmake_minimum_required(VERSION 3.5) 
project(proba) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(SOURCE_FILES main.cpp MyClass.h MyClass.cpp) 
add_executable(proba ${SOURCE_FILES}) 

Тем не менее он дает тот же результат. Я невежественна.

+0

Прежде чем я Mjolnir это, просто чтобы быть уверенным: Есть вы действительно используете MinGW? –

+0

@ baum-mit-augen Нет, Mac – miller

+0

Тогда, пожалуйста, сообщите нам, какую версию компилятора и стандартной библиотеки вы используете. Но если это gcc/libstdC++, это, вероятно, та же проблема, что и в случае MinGW. –

ответ

0

Ну, я окончательно решил проблему. Ошибка была с помощью

currentMyMatrix_.push_back(array); 

Он всегда толкать новые значения в конце, так что код будет видеть только первые noMotors_ arrays.This решение:

currentMyMatrix_.at(i) = array; 
1

Возможно, вы снова создадите ту же самую случайную последовательность времени и времени, потому что вы перезагружаете генератор.

http://en.cppreference.com/w/cpp/numeric/random/random_device

станд :: random_device может быть реализован с точкой зрения реализации определенного числа двигателя псевдослучайным, если недетерминированный источник (например, аппаратное устройство) не доступен для реализации. В этом случае каждый объект std :: random_device может генерировать одну и ту же последовательность чисел.