Namespaces
Variants

std::ranges:: generate_random

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace 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 & >> &&
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 ) ) ranges:: generate ( std:: forward < R > ( r ) , [ & d, & g ] { return std:: invoke ( d, g ) ; } ) ,分别对应 (1) (3)

1) 若此表达式格式正确,则调用 g. generate_random ( std:: forward < R > ( r ) )
否则,令 I std:: invoke_result_t < G & > 。若 R 满足 sized_range 概念,则通过执行未指定次数的 g ( ) g. generate_random ( s ) 形式调用(若该表达式对于值 N 和类型为 std:: span < I, N > 的对象 s 是良构的),用 ranges:: size ( r ) I 类型的值填充 r
否则,执行回退操作。
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 ) 形式调用(若该表达式对于值 N 和类型为 std:: span < I, N > 的对象 s 是合法表达式),用类型 I ranges:: size ( r ) 个值填充 r
否则,执行回退操作。
2,4) 分别等价于 (1,3) ,其中 r 是从 ranges:: subrange < O, S > ( std :: move ( first ) , last ) 获得的。

如果 (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

参见

将函数结果保存到范围中
(算法函数对象)
指定类型符合均匀随机比特生成器的要求
(概念)