std::ranges::generate_random
来自 zh.cppreference.net
| 定义于头文件 <random>
|
||
| 调用签名 |
||
template< class R, class G >
requires ranges::output_range<R, std::invoke_result_t<G&>> &&
std::uniform_random_bit_generator<std::remove_cvref_t<G>>
constexpr ranges::borrowed_iterator_t<R>
generate_random( R&& r, G&& g );
|
(1) | (自 C++26 起) |
template< class G, std::output_iterator<std::invoke_result_t<G&>> O,
std::sentinel_for<O> S >
requires std::uniform_random_bit_generator<std::remove_cvref_t<G>>
constexpr O
generate_random( O first, S last, G&& g );
|
(2) | (自 C++26 起) |
template< class R, class G, class D >
requires ranges::output_range<R, std::invoke_result_t<D&, G&>> &&
std::invocable<D&, G&> &&
std::uniform_random_bit_generator<std::remove_cvref_t<G>> &&
std::is_arithmetic_v<std::invoke_result_t<D&, G&>>
constexpr ranges::borrowed_iterator_t<R>
generate_random( R&& r, G&& g, D&& d );
|
(3) | (自 C++26 起) |
template< class G, class D, std::output_iterator<std::invoke_result_t<D&, G&>> O,
std::sentinel_for<O> S >
requires std::invocable<D&, G&> &&
std::uniform_random_bit_generator<std::remove_cvref_t<G>> &&
std::is_arithmetic_v<std::invoke_result_t<D&, G&>>
constexpr O
generate_random( O first, S last, G&& g, D&& d );
|
(4) | (自 C++26 起) |
尝试使用随机数生成器或分布的 generate_random 成员函数生成随机数,这预计会更高效。如果没有可用的 generate_random 成员函数,则回退到逐元素生成。
令回退操作为分别对 ranges::generate(std::forward<R>(r), std::ref(g))(1)ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }) 或 (1)(3) 或 (3) 调用
1) 如果此表达式格式正确,则调用
g.generate_random(std::forward<R>(r))。 否则,令
I 为 std::invoke_result_t<G&>。如果 R 满足 sized_range 这一概念,则通过执行未指定次数的形如 r 或 ranges::size(r) 的调用(如果对值 I 和类型 g() 的对象 g.generate_random(s) 来说这样的表达式格式正确),用 N 个 s 类型的值填充 std::span<I, N>。 否则,执行回退操作。
3) 如果此表达式格式正确,则调用
d.generate_random(std::forward<R>(r), g)。 否则,令
I 为 std::invoke_result_t<D&, G&>。如果 R 满足 sized_range 这一概念,则通过执行未指定次数的形如 r 或 ranges::size(r) 的调用(如果对值 I 和类型 std::invoke(d, g) 的对象 d.generate_random(s, g) 来说这样的表达式格式正确),用 N 个 s 类型的值填充 std::span<I, N>。 否则,执行回退操作。
2,4) 分别等价于 (1,3),其中
r 是从 ranges::subrange<O, S>(std::move(first), last) 获得的。如果 (1) 或 (3) 的效果与相应回退操作的效果不等价,则行为未定义。
N 的值在每次调用中可以不同。实现可以对较短的范围选择更小的值。
本页描述的函数式实体是 算法函数对象(非正式名称为 niebloid),即:
参数
| first, last | - | 定义待写入随机数的元素 范围 的迭代器-哨位对 |
| r | - |
待写入随机数的
range
范围
|
| g | - | 均匀随机位生成器 |
| d | - | 随机数分布对象 |
注释
在
std::ranges::generate_random
标准化之时,标准库中尚未存在提供
generate_random
成员函数的随机数生成器或分布器。
std::ranges::generate_random
在使用封装了底层向量化API的自定义随机数生成器时,能够实现更高的运行效率。
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_ranges_generate_random
|
202403L
|
(C++26) |
std::ranges::generate_random
|
示例
运行此代码
#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
参见
|
(C++20)
|
将函数结果保存到范围中
(算法函数对象) |
|
(C++20)
|
指定类型符合均匀随机比特生成器的要求
(概念) |