std::sample
From cppreference.com
| ヘッダー <algorithm> で定義 |
||
| template< class PopulationIt, class SampleIt, class Distance, class URBG > SampleIterator sample( PopulationIt first, PopulationIt last, |
(C++17以降) | |
シーケンス [first, last) から n 個の要素を(重複なしで)選択し、可能なすべてのサンプルが等しい確率で出現するようにし、選択された要素を出力イテレータ out に書き込みます。乱数は乱数ジェネレータ g を使用して生成されます。
n がシーケンス内の要素数より大きい場合、シーケンス内のすべての要素を選択します。
このアルゴリズムは、`PopulationIt` が LegacyForwardIterator の要件を満たしている場合にのみ安定です(選択された要素の相対順序を保持します)。
first の値型(C++20まで)*first(C++20以降) が out に書き込み可能でない場合、プログラムは不適格です。
次のいずれかの条件が満たされる場合、動作は未定義です。
- out は
[first,last)内にあります。 - `PopulationIt` は LegacyInputIterator の要件を満たしません。
- `SampleIt` は LegacyOutputIterator の要件を満たしません。
- 以下のすべての条件が満たされます
|
(C++23まで) |
|
(C++23から) |
- `SampleIt` は LegacyRandomAccessIterator の要件を満たしません。
- 型 `T` を std::remove_reference_t<URBG> とすると、以下のいずれかの条件が満たされます。
- `T` は UniformRandomBitGenerator の要件を満たしません。
|
(C++20まで) |
目次 |
[編集] パラメーター
| first, last | - | サンプリング(母集団)を行う要素の範囲を定義するイテレータのペア |
| out | - | サンプルが書き込まれる出力イテレータ |
| n | - | 作成するサンプルの数 |
| g | - | ランダム性のソースとして使用される乱数ジェネレータ |
| 型要件 | ||
| -`Distance` は整数型でなければなりません。 | ||
[編集] 戻り値
最後に出力されたサンプルの後、つまりサンプル範囲の終わりにある out のコピーを返します。
[編集] 計算量
std::distance(first, last) に対して線形。
[編集] 可能な実装
libstdc++、libc++、および MSVC STL の実装を参照してください。
[編集] 備考
この関数は、選択サンプリングまたはリザーバーサンプリングを実装する場合があります。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_sample |
201603L |
(C++17) | std::sample
|
[編集] 例
このコードを実行
#include <algorithm> #include <iostream> #include <iterator> #include <random> #include <string> int main() { std::string in {"ABCDEFGHIJK"}, out; std::sample(in.begin(), in.end(), std::back_inserter(out), 4, std::mt19937 {std::random_device{}()}); std::cout << "Four random letters out of " << in << " : " << out << '\n'; }
実行結果の例
Four random letters out of ABCDEFGHIJK: EFGK
[編集] 関連項目
| (C++17まで)(C++11) |
範囲内の要素をランダムに並べ替える (関数テンプレート) |
| (C++20) |
シーケンスからN個のランダムな要素を選択する (アルゴリズム関数オブジェクト) |