std::ranges::generate_random
| ヘッダー <random> で定義 |
||
| 呼び出しシグネチャ |
||
| template< class R, class G > requires ranges::output_range<R, std::invoke_result_t<G&>> && |
(1) | (C++26以降) |
| template< class G, class O, std::output_iterator<std::invoke_result_t<G&>>, std::sentinel_for<O> S > |
(2) | (C++26以降) |
| template< class R, class G, class D > requires ranges::output_range<R, std::invoke_result_t<D&, G&>> && |
(3) | (C++26以降) |
| template< class G, class D, std::output_iterator<std::invoke_result_t<D&, G&>> O, std::sentinel_for<O> S > |
(4) | (C++26以降) |
乱数生成器の `generate_random` メンバ関数、または分布の `generate_random` メンバ関数を呼び出して乱数を生成しようとします。これは、より効率的であることが期待されます。`generate_random` メンバ関数が利用できない場合は、要素ごとの生成にフォールバックします。
(1) または (3) において、フォールバック操作は、ranges::generate(std::forward<R>(r), std::ref(g))、または ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }) に相当します。
R が sized_range をモデルとする場合、ranges::size(r) 個の I 型の値を r に格納します。これは、g() または g.generate_random(s) の形式の呼び出しを、N という値と std::span<I, N> 型のオブジェクト s に対して、指定されていない回数だけ実行することによって行われます。R が sized_range をモデルとする場合、ranges::size(r) 個の I 型の値を r に格納します。これは、std::invoke(d, g) または d.generate_random(s, g) の形式の呼び出しを、N という値と std::span<I, N> 型のオブジェクト s に対して、指定されていない回数だけ実行することによって行われます。(1) または (3) の効果が、対応するフォールバック操作の効果と同等でない場合、動作は未定義です。
N の値は呼び出しごとに異なる場合があります。実装では、短い範囲に対してより小さい値を選択することがあります。
このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式にはニーブロイドとして知られている)です。つまり、
- これらのいずれかを呼び出す際に、明示的なテンプレート引数リストを指定することはできません。
- これらのいずれも実引数依存の名前探索には見えません。
- これらのいずれかが関数呼び出し演算子の左側の名前として通常の非修飾名探索によって見つかった場合、実引数依存の名前探索は抑制されます。
目次 |
[編集] パラメータ
| first, last | - | 乱数が書き込まれる要素の 範囲 を定義するイテレータ-センチネルペア |
| r | - | 乱数が書き込まれる 範囲 |
| 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) |
型が一様乱数ビット生成器として適格であることを指定する (コンセプト) |