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
(注:指定されたテキストブロックには翻訳対象となる可読テキストが含まれていないため、HTML構造はそのまま保持されます)
定義済みヘッダー <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 をモデル化する場合、 r ranges:: size ( r ) 個の I の値で埋める。これは、未規定の回数の呼び出し g ( ) または g. generate_random ( s ) を実行することによって行われる。ただし、そのような式が値 N と型 std:: span < I, N > のオブジェクト s に対して well-formed である場合に限る。
それ以外の場合、フォールバック操作を実行します。
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 と型 std:: span < I, N > のオブジェクト s に対して well-formed である場合に限る。
それ以外の場合、フォールバック操作を実行します。
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

関連項目

関数の結果を範囲に保存する
(アルゴリズム関数オブジェクト)
型が一様ランダムビット生成器として適格であることを指定する
(コンセプト)