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

时间:2018-12-18 02:12:44

标签: c++ random stl stdvector uniform-initialization

我有一个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 :(得分:3)

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

答案 1 :(得分:3)

您可以将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);
});

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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

Storyboard