C ++中随机生成的向量不会更改值

时间:2016-04-08 22:27:11

标签: c++ random stdvector

我的类包含一些类型的矢量矩阵:

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()上生成相同的矩阵。或者它没有写入它?可能我在这里遗漏了一些东西,所以任何帮助都会受到赞赏。

更新

以下是可以编译和测试的代码:

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

它仍然提供相同的输出。我很傻。

2 个答案:

答案 0 :(得分:1)

您可能会一次又一次地生成相同的随机序列,因为您正在重置您的生成器。

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

  如果非确定性源(例如,硬件设备)对于实现不可用,则可以根据实现定义的伪随机数引擎来实现std :: random_device。在这种情况下,每个std :: random_device对象可以生成相同的数字序列。

答案 1 :(得分:0)

好吧,我最终解决了问题。使用

时出错
currentMyMatrix_.push_back(array);

它总是在最后推送新值,因此代码只会看到第一个noMotors_数组。这是一个解决方案:

currentMyMatrix_.at(i) = array;