为何本C++示例中的std::generate函数无法编译通过?
伯努利分布随机序列生成代码的编译错误修复
你的代码存在三个关键问题,导致std::generate编译报错,下面逐一说明并给出修复方案:
错误点1:lambda不符合std::generate的要求
std::generate需要的是无参可调用对象,但你定义的lambda带两个参数,并且调用时直接执行oneBernoulli(mtre, dist),这会返回一个bool值而非可调用对象,完全不符合generate的参数要求。
解决方法:让lambda通过捕获机制获取mt19937_64引擎和伯努利分布,改成无参调用。
错误点2:随机引擎按值传递会导致重复值
如果按值捕获mt19937_64,每次调用lambda都会使用引擎的副本,生成的随机值会完全重复。必须按引用捕获,保证所有调用共享同一个引擎的状态。
错误点3:numeric_limits的误用
numeric_limits<std::deque<bool>>::quiet_NaN()是非法的,quiet_NaN仅适用于数值类型,容器类型没有这个成员。错误分支可以返回空deque作为标识。
修复后的完整代码
#include "Functions.hpp" #include <random> #include <algorithm> #include <iostream> #include <deque> using std::cout; using std::endl; std::deque<bool> retBernoulli(double p, int seed, int size) { std::bernoulli_distribution dist(p); std::mt19937_64 mtre(seed); std::deque<bool> bernies(size); // 按引用捕获引擎和分布,定义无参lambda auto oneBernoulli = [&mtre, &dist]() { return dist(mtre); }; // 输入合法性检查 if (p < 0 || p > 1 || seed < 0 || size < 0) { cout << "Oops....not a number. Check your inputs" << endl; return {}; // 返回空deque作为错误标识 } else { std::generate(bernies.begin(), bernies.end(), oneBernoulli); // print(bernies); return bernies; } }
额外说明
- 捕获列表
[&mtre, &dist]表示按引用捕获这两个变量,确保每次调用lambda都使用同一个引擎和分布实例 - 错误分支返回
{}会构造一个空的std::deque<bool>,比原代码的非法调用更合理 - 移除了不必要的
numeric_limits引用,因为原用法完全错误
内容的提问来源于stack exchange,提问作者olyjazzhead
相关产品推荐
相关产品推荐

