std::ranges:: generate_random
std::ranges
| Non-modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Partitioning operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sorting operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Binary search operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Set operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Heap operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Minimum/maximum operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Permutation operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fold operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operations on uninitialized storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Return types | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<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
概念,则通过执行未指定次数的
g
(
)
或
g.
generate_random
(
s
)
形式调用(若该表达式对于值
N
和类型为
std::
span
<
I, N
>
的对象
s
是良构的),用
ranges::
size
(
r
)
个
I
类型的值填充
r
。
R
满足
sized_range
概念,则通过执行未指定次数的
std::
invoke
(
d, g
)
或
d.
generate_random
(
s, g
)
形式调用(若该表达式对于值
N
和类型为
std::
span
<
I, N
>
的对象
s
是合法表达式),用类型
I
的
ranges::
size
(
r
)
个值填充
r
。
如果 (1) 或 (3) 的效果与对应回退操作的效果不等价,则行为未定义。
N
的值在不同调用中可能有所不同。实现可以为较短的范围选择较小的值。
本页面描述的函数式实体是 算法函数对象 (非正式称为 niebloids ),即:
目录 |
参数
| 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)
|
指定类型符合均匀随机比特生成器的要求
(概念) |