Генерация случайного числа в 2D векторе C ++ - PullRequest
0 голосов
/ 01 апреля 2019

Я реализую простой двумерный векторный класс в C ++, который инициализирует двумерный вектор с заданным размером (числом строк и столбцов) и определением, рандомизировать это значение или нет.Я также реализую метод для вывода матрицы на консоль, чтобы увидеть результат.

Я попытался запустить код с помощью GCC 8.3.0 в Windows (MSYS2) с флагом "-std = c ++ 17».Вот код.

#include <random>
#include <iostream>
#include <vector>


class Vec2D
{
public:
    Vec2D(int numRows, int numCols, bool isRandom)
    {
        this->numRows = numRows;
        this->numCols = numCols;

        for(int i = 0; i < numRows; i++) 
        {
            std::vector<double> colValues;

            for(int j = 0; j < numCols; j++) 
            {
                double r = isRandom == true ? this->getRand() : 0.00;
                colValues.push_back(r);
            }

            this->values.push_back(colValues);
        }
    }

    double getRand()
    {
        std::random_device rd;
        std::mt19937 gen(rd());
        std::uniform_real_distribution<> dis(0,1);

        return dis(gen);
    }

    void printVec2D()
    {
        for(int i = 0; i < this->numRows; i++) 
        {
            for(int j = 0; j < this->numCols; j++)
            {
                std::cout << this->values.at(i).at(j) << "\t";
            }
        std::cout << std::endl;
        }
    }
private:
    int numRows;
    int numCols;

    std::vector< std::vector<double> > values;
};

int main()
{
    Vec2D *v = new Vec2D(3,4,true);

    v->printVec2D();
}

То, что я ожидал, - это двумерный вектор со случайным значением, когда аргумент isRandom равен true.Вместо этого я получил вектор с одинаковыми значениями.Например.когда я запускаю код на своем компьютере, я получаю следующее:

0.726249        0.726249        0.726249        0.726249
0.726249        0.726249        0.726249        0.726249
0.726249        0.726249        0.726249        0.726249

Мой вопрос: что не так с моим кодом C ++?Заранее благодарю за ответ.

1 Ответ

1 голос
/ 01 апреля 2019

Я думаю, что генератор не должен создаваться каждый раз, сделайте эту часть участника и вызовите только dis

    std::random_device rd; //Will be used to ***obtain a seed for the random number engine***
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0,1);

, а во-вторых, убедитесь, что вы позвонили

std::srand(std::time(nullptr));

только один раз при подаче заявления

...