std::ranges::generate_random
定义在头文件 <random> 中 |
||
调用签名 |
||
template< class R, class G > requires ranges::output_range<R, std::invoke_result_t<G&>> && |
(1) | (自 C++26 起) |
template< class G, std::output_iterator<std::invoke_result_t<G&>> O, std::sentinel_for<O> S > |
(2) | (自 C++26 起) |
template< class R, class G, class D > requires ranges::output_range<R, std::invoke_result_t<D&, G&>> && |
(3) | (自 C++26 起) |
template< class G, class D, std::output_iterator<std::invoke_result_t<D&, G&>> O, std::sentinel_for<O> S > |
(4) | (自 C++26 起) |
尝试使用随机数生成器的 generate_random
成员函数或分布来生成随机数,这预计效率更高。如果不可用 generate_random
成员函数,则回退到逐元素生成。
回退操作将调用 ranges::generate(std::forward<R>(r), std::ref(g)) 或 ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }),分别针对 (1) 或 (3)。
R
符合 sized_range
模型,则通过执行以下形式的调用来填充 r 中的 ranges::size(r) 个 I 值:g() 或 g.generate_random(s)(如果针对某个 N
值和一个类型为 std::span<I, N> 的对象 s 存在格式正确的表达式)。R
符合 sized_range
模型,则通过执行以下形式的调用来填充 r 中的 ranges::size(r) 个类型为 I 的值:std::invoke(d, g) 或 d.generate_random(s, g)(如果针对某个 N
值和一个类型为 std::span<I, N> 的对象 s 存在格式正确的表达式)。如果 (1) 或 (3) 的效果与相应回退操作的效果不相同,则行为未定义。
N
的值在调用之间可能不同。实现可能针对较短的范围选择较小的值。
此页面上描述的类函数实体是 niebloids,即
在实践中,它们可能通过函数对象实现,或者通过特殊的编译器扩展实现。
内容 |
[edit] 参数
first, last | - | 迭代器-哨兵对,表示写入随机数的范围。 |
r | - | 写入随机数的范围。 |
g | - | 均匀随机位生成器。 |
d | - | 随机数分布对象。 |
[edit] 说明
在 std::ranges::generate_random
标准化时,标准库中没有提供 generate_random
成员函数的随机数生成器或分布。
当与包装基础矢量化 API 的用户定义随机数生成器一起使用时,std::ranges::generate_random
可能更高效。
功能测试 宏 | 值 | Std | 功能 |
---|---|---|---|
__cpp_lib_ranges_generate_random |
202403L | (C++26) | std::ranges::generate_random
|
[edit] 示例
#include <algorithm> #include <iomanip> #include <iostream> #include <random> int main() { std::default_random_engine eng; std::default_random_engine::result_type rs[16]{}; std::ranges::generate_random(rs, eng); std::cout << std::left; for (int i{}; auto n : rs) std::cout << std::setw(11) << n << (++i % 4 ? ' ' : '\n'); }
可能的输出
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 823564440 1115438165 1784484492 74243042 114807987 1137522503
[edit] 另请参阅
(C++20) |
将函数的结果保存到范围内。 (niebloid) |
(C++20) |
指定类型是否符合均匀随机位生成器。 (concept) |