命名空间
变体
操作

std::ranges::generate_random

来自 cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
算法库
受约束的算法和范围上的算法 (C++20)
受约束的算法,例如 ranges::copy, ranges::sort, ...
执行策略 (C++17)
排序和相关操作
分区操作
排序操作
二分搜索操作
(在已分区范围内)
集合操作(在已排序范围内)
合并操作(在已排序范围内)
堆操作
最小值/最大值操作
(C++11)
(C++17)
字典序比较操作
排列操作
C 库
数值操作
未初始化内存操作
 
受约束的算法
此菜单中的所有名称都属于命名空间 std::ranges
非修改序列操作
修改序列操作
分区操作
排序操作
二分搜索操作(在已排序范围内)
       
       
集合操作(在已排序范围内)
堆操作
最小值/最大值操作
       
       
排列操作
折叠操作
数值操作
(C++23)            
随机数生成
generate_random
(C++26)
未初始化存储操作
返回值类型
 
定义在头文件 <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>>
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>>
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))ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }),分别针对 (1)(3)

1) 如果此表达式格式正确,则调用 g.generate_random(std::forward<R>(r))
否则,令 Istd::invoke_result_t<G&>。如果 R 符合 sized_range 模型,则通过执行以下形式的调用来填充 r 中的 ranges::size(r)I 值:g()g.generate_random(s)(如果针对某个 N 值和一个类型为 std::span<I, N> 的对象 s 存在格式正确的表达式)。
否则,执行回退操作。
3) 如果此表达式格式正确,则调用 d.generate_random(std::forward<R>(r), g)
否则,令 Istd::invoke_result_t<D&, G&>。如果 R 符合 sized_range 模型,则通过执行以下形式的调用来填充 r 中的 ranges::size(r) 个类型为 I 的值:std::invoke(d, g)d.generate_random(s, g)(如果针对某个 N 值和一个类型为 std::span<I, N> 的对象 s 存在格式正确的表达式)。
否则,执行回退操作。
2,4) 等效于分别针对 (1,3),其中 r 来自 ranges::subrange<O, S>(std::move(first), last)

如果 (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] 另请参阅

将函数的结果保存到范围内。
(niebloid)[edit]
指定类型是否符合均匀随机位生成器。
(concept) [edit]