Namespaces
Variants

std::ranges::generate_random

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲アルゴリズム (C++20)
制約付きアルゴリズム(例:ranges::copy、ranges::sort、...)
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対して)
集合操作(ソート済み範囲に対して)
マージ操作(ソート済み範囲に対して)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書式比較操作
置換操作


 
制約付きアルゴリズム
このメニュー内の名前はすべてstd::ranges
名前空間に属します。
(C++23)
unique_copy
stable_partition
partial_sort_copy
equal_range
set_symmetric_difference
pop_heap
clamp
prev_permutation
fold_left_first  
fold_right
fold_right_last  
fold_left_with_iter
fold_left_first_with_iter
(C++23)
iota            
(C++23)
generate_random
(C++26)
uninitialized_value_construct_n
 
(C++23)<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)
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 );
(C++26 以降) (2)
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 );
(C++26 以降) (3)
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 );
(C++26 以降) (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)

に対しては を呼び出すこととします。 g.generate_random(std::forward<R>(r))1)
この式が適格である場合、I を呼び出します。std::invoke_result_t<G&> そうでない場合、R を とします。sized_ranger のモデルである場合、ranges::size(r) を I 型の g() 個の値で埋めます。このとき、適格な式 g.generate_random(s) または N が存在する場合、それらを不特定回数呼び出します(s は値、std::span<I, N> は型
のオブジェクト)。
そうでない場合、フォールバック操作を実行します。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 は値、s は型 std::span<I, N> のオブジェクト)。
そうでない場合、フォールバック操作を実行します。
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

関連項目

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