我正在编写一个简单的 C++ 程序,它生成一个正态分布的随机整数值列表,然后获取前 N 个生成的项目并过滤它们,使它们的绝对值大于 42。我编写的代码如下:
int main() {
//convenience
namespace rng = std::ranges;
namespace view = std::views;
//random generation boilerplate
std::random_device r;
std::mt19937 gen(r());
std::normal_distribution<float> taps(-4, 15);
//the filtering
for (const auto& value : view::repeat(0)
| view::transform([&taps, &gen](auto _) { return std::round(taps(gen)); })
| view::take(1005)
| view::filter([](auto val) { return (val < -42 || val > 42); }))
{
std::cout << value << ' ';
}
return 0;
}
如果我删除该view::filter
行,则序列似乎完全正常,并且大约有 3 个左右的值满足条件。然而,当应用过滤器时,输出似乎是一些随机垃圾,例如-12 -8 -14 2 -4 -11 -38
. 这有什么意义呢?这些数字甚至不满足过滤条件。任何帮助表示赞赏。
注意:在 Windows 和 Linux 上均
使用 编译。如果我用views::iota(0)替换views::repeat(0)并用 编译,输出是相同的——一些随机垃圾。另外,如果有人建议从 lambda 生成列表的更好方法,我将非常感激。g++ -o test main.cpp -std=c++2b
-std=c++20