std::sample
| ヘッダ <algorithm>
|
||
template< class PopulationIt, class SampleIt, class Distance, class URBG >
SampleIterator sample( PopulationIt first, PopulationIt last,
SampleIt out, Distance n, URBG&& g );
|
で定義 (C++17以上) | |
シーケンス n から [first, last) 個の要素を(非復元抽出で)選択し、各可能な標本が等しい出現確率を持つようにして、選択した要素を出力イテレータ out に書き込みます。乱数は乱数生成器 g を用いて生成されます。
n がシーケンス内の要素数より大きい場合、シーケンス内の全要素を選択します。
このアルゴリズムは、PopulationIt が LegacyForwardIterator の要件を満たす場合にのみ安定です(選択された要素の相対的な順序を保持します)。
first の値型が *first(C++20未満)(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 で参照してください。
注記
この関数は選択サンプリングまたは reservoir sampling を実装する可能性があります。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__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) |
|
(C++20) |
シーケンスからN個のランダムな要素を選択する (アルゴリズム関数オブジェクト) |