我有一个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);
}
这对我来说似乎不是很优雅,所以我想知道是否有更聪明的方法来做到这一点?
答案 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::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);
});
答案 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