std::ranges::generate_random
ja.cppreference.net より
| (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
関連項目
|
(C++20)
|
関数の結果を範囲に保存する
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
型が一様ランダムビット生成器として適格であることを指定する
(コンセプト) |