无法按 lambda 中的值捕获随机分布和生成器?
Can not capture a random distribution and generator by value in lambda?
以下代码工作正常
#include <iostream>
#include <random>
int main() {
std::default_random_engine generator;
std::normal_distribution<double> distribution(5.0, 2.0);
std::vector<double> v(100);
std::generate(v.begin(), v.end(), [&] () { return distribution(generator); });
return 0;
}
但是,将 lambda 的捕获列表更改为[=]
或[&, distribution]
或[&, generator]
原因
rand.cpp:9:59: error: no matching function for call to object of type 'const std::normal_distribution<double>'
error: assigning to 'double' from incompatible type 'void'
是否有某些类型的对象不能通过 lambda 中的值捕获?
看起来std::normal_distribution<double>::operator()
不是const
. 因此,您必须将mutable
关键字添加到lambda中:
std::generate(v.begin(), v.end(), [=] () mutable {
return distribution(generator);
});
std::generate(v.begin(), v.end(), [&, distribution] () mutable {
return distribution(generator);
});
这些都可以正常工作。
通常,按值捕获要求对象是可复制的。std::default_random_generator
和std::normal_distribution
都是可复制的,所以这应该不是问题。
Lambda 捕获始终是常量值或常量引用。随机数生成本质上是有状态的,因此被调用的operator()
不能是常量,因为它可能会修改对象状态。错误消息神秘地报告了这一点,说没有函数可以调用const std::normal_distribution<double>
。
如果要修改捕获的对象,则必须将 lambda 声明为可变对象
#include <iostream>
#include <random>
#include <algorithm>
int main() {
std::default_random_engine generator;
std::normal_distribution<double> distribution(5.0, 2.0);
std::vector<double> v(100);
std::generate(v.begin(), v.end(), [generator, distribution] () mutable { return distribution(generator); });
return 0;
}
相关文章:
- 如何创建没有特定定义的随机分布?uniform_int_distribution是从其他类继承的吗?
- C++:创建1000次唯一的随机分布,在任何分布中都没有重复的数字
- 无法按 lambda 中的值捕获随机分布和生成器?
- 在运行时为随机分布类成员设置最小和最大边界?
- C++11 与不同类型的随机分布共享相同的函数
- 我可以在不指定数字分布的情况下使用随机生成器吗?
- 随机分布,如discrete_distribution<float>
- C 中高斯的随机正态分布
- 分布在-DBL_MAX和DBL_MAX之间的随机双打
- 如何在不重新发明轮子的情况下为自定义类型生成均匀分布的随机实数
- 伪随机分布,它保证了值序列-C++的所有可能的排列
- 如何创建一个在单独的方法中工作的c++随机正态分布
- 为什么这个随机变量没有均匀分布?
- 如何在C++中随机采样具有给定平均值和标准误差的正态分布
- 减少每次通过时的随机均匀int分布
- 对 C++11 随机分布的界面设计感到困惑
- 在C++中获取均匀分布的随机整数的标准方法是什么?
- 每次循环进行临时均匀随机分布的效率如何
- 使用一个随机引擎在c++11中实现多个分布
- C++11交叉编译器/标准库随机分布再现性