Инициализируйте std :: vector размера N с помощью std ::iform_real_distribution <double> - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть std::vector<double> x, размер которого я не знаю во время компиляции.Предполагая, что размер вектора равен N, я хочу присвоить ему N равномерно распределенные случайные значения.В настоящее время я делаю это в цикле

std::default_random_engine generator;
std::uniform_real_distribution<double> distribution_pos(0.0,1.0);
for (auto it = x.begin(); it != x.end(); it++)
{
  *it = distribution_pos(generator);
}

Это не кажется мне очень элегантным, поэтому мне было интересно, есть ли более разумный способ сделать это?

Ответы [ 4 ]

0 голосов
/ 18 декабря 2018

Если вы не хотите заранее резервировать память в векторе, тогда это будет работать.

#include <vector>
#include <random>
#include <algorithm>
#include <iterator>

int main() {
  std::vector<double> x;
  const int n = 10;

  std::default_random_engine gen(std::random_device{}());
  std::uniform_real_distribution<double> dist(0.0, 1.0);
  std::generate_n(std::back_inserter(x), n, [&]{ return dist(gen); });
}
0 голосов
/ 18 декабря 2018

Вы можете использовать std::generate или std::generate_n как:

#include <algorithm>

std::generate(std::begin(x), std::end(x), [&] {
    return distribution_pos(generator);
});

std::generate_n(std::begin(x), N, [&] {
    return distribution_pos(generator);
});
0 голосов
/ 18 декабря 2018

Я бы использовал std::generate:

std::vector<double> x(10);

std::default_random_engine gen{std::random_device{}()};
std::uniform_real_distribution<double> dist(0.0, 1.0);

std::generate(std::begin(x), std::end(x), [&]{ return dist(gen); });

Примечание:

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

Я не рекомендую std::default_random_engine, потому что Стандарт не гарантирует качество или воспроизводимость в различных реализациях или версиях компилятора.

0 голосов
/ 18 декабря 2018

Вы можете использовать std::generate как показано ниже:

// First create an instance of an engine.
random_device rnd_device;

// Specify the engine and distribution.
mt19937 mersenne_engine {rnd_device()};  // Generates random doubles
std::uniform_real_distribution<double> dist (0, 1.0);

auto gen = [&dist, &mersenne_engine](){
               return dist(mersenne_engine);
           };

std::vector<double> x(N);
std::generate(begin(x), end(x), gen);

См. demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...