用 std::uniform_real_distribution<double> 初始化一个 N 大小的 std::vector

Initialize an N-sized std::vector with std::uniform_real_distribution<double>

我有一个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);
}

这对我来说似乎不太优雅,所以我想知道是否有更聪明的方法来做到这一点?

您可以像下面这样使用 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

您可以使用 std::generatestd::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);
});

我会使用 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,因为该标准不保证跨实现或编译器版本的质量或再现性。

如果您不想事先在向量中保留内存,那么这将起作用。

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