std::ranges::generate_random
来自cppreference.com
| 在标头 <random> 定义
|
||
| 调用签名 |
||
| |
(1) | (C++26 起) |
| |
(2) | (C++26 起) |
| |
(3) | (C++26 起) |
| |
(4) | (C++26 起) |
尝试用随机数生成器或分布的 generate_random 成员函数生成随机数,这被期望更为高效。如果没有可用的 generate_random 成员函数则回落到生成逐个元素。
对 (1) 或 (3) 分别令后备操作为调用 ranges::generate(std::forward<R>(r), std::ref(g)) 或 ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); })。
1) 如果
g.generate_random(std::forward<R>(r)) 良构则执行此表达式。 否则,令
I 为 std::invoke_result_t<G&>。若 R 实现 sized_range,则通过未指定次数的 g() 或 g.generate_random(s) 调用,对 r 填充 ranges::size(r) 个 I 类型值,如果后者于对值 N 和 std::span<I, N> 类型的对象 s 良构。 否则进行后备操作。
3) 如果
d.generate_random(std::forward<R>(r), g) 良构则执行此表达式。 否则,令
I 为 std::invoke_result_t<D&, G&>。若 R 实现 sized_range,则通过未指定次数的 std::invoke(d, g) 或 d.generate_random(s, g) 调用,对 r 填充 ranges::size(r) 个 I 类型值,如果后者于对值 N 和 std::span<I, N> 类型的对象 s 良构。 否则进行后备操作。
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) |
指定类型具备作为均匀随机位生成器的资格 (概念) |