使用 std::uniform_real_distribution 初始化一个 N 大小的 std::vector<double>
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
:
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
,因为该标准不保证跨实现或编译器版本的质量或可重现性。
您可以使用如下所示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::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);
});
如果您不想事先在向量中保留内存,那么这将起作用。
#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); });
}
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?