std::experimental::sample
From cppreference.com
< cpp | experimental
| ヘッダ <experimental/algorithm> で定義 |
||
| template< class PopulationIterator, class SampleIterator, class Distance, class URBG > |
(1) | (Library Fundamentals TS) |
| template< class PopulationIterator, class SampleIterator, class Distance > SampleIterator sample( PopulationIterator first, PopulationIterator last, |
(2) | (Library Fundamentals TS v2) |
シーケンスfirstからlastまでの範囲からn個の要素を選択し、それぞれの可能なサンプルが等しい確率で出現するようにします。選択された要素は出力イテレータoutに書き込まれます。
もしnがシーケンスの要素数より大きい場合、last - first個の要素が選択されます。
アルゴリズムが安定するのは、PopulationIteratorがLegacyForwardIteratorの要件を満たす場合のみです。
1)乱数は乱数生成器gを使用して生成されます。
2)乱数はスレッドローカルなエンジンを使用して生成されます。
目次 |
[編集] パラメータ
| first, last | - | サンプリング元の範囲(母集団)を形成するイテレータのペア。 |
| out | - | サンプルが書き込まれる出力イテレータ。範囲firstからlastの範囲内であってはなりません。 |
| n | - | 生成するサンプルの数。 |
| g | - | ランダム性のソースとして使用される乱数ジェネレータ |
-PopulationIteratorはLegacyInputIteratorの要件を満たす必要があります。 | ||
-SampleIteratorはLegacyOutputIteratorの要件を満たす必要があります。 | ||
-PopulationIteratorがLegacyForwardIteratorの要件を満たさない場合、SampleIteratorはLegacyRandomAccessIteratorの要件も満たす必要があります。 | ||
-PopulationIteratorの値型はoutに書き込み可能である必要があります。 | ||
-Distanceは整数型である必要があります。 | ||
-URBGはUniformRandomBitGeneratorの要件を満たす必要があり、その戻り値の型はDistanceに変換可能である必要があります。 | ||
[編集] 戻り値
最後に出力されたサンプル(すなわち、サンプル範囲の終端)の次の位置を指すoutのコピーを返します。
[編集] 計算量
std::distance(first, last)に対して線形。
[編集] 注記
この関数は、選択サンプリングまたはリザーバーサンプリングを実装する場合があります。
[編集] 例
このコードを実行
#include <experimental/algorithm> #include <iostream> #include <iterator> #include <random> #include <string> int main() { std::string in = "abcdefgh", out; std::experimental::sample(in.begin(), in.end(), std::back_inserter(out), 5, std::mt19937{std::random_device{}()}); std::cout << "five random letters out of " << in << " : " << out << '\n'; }
実行結果の例
five random letters out of abcdefgh : cdefg
[編集] 関連項目
| (C++17まで)(C++11) |
範囲内の要素をランダムに並べ替える (関数テンプレート) |