名前空間
変種
操作

std::experimental::sample

From cppreference.com
 
 
 
 
ヘッダ <experimental/algorithm> で定義
template< class PopulationIterator, class SampleIterator,

          class Distance, class URBG >
SampleIterator sample( PopulationIterator first, PopulationIterator last,
                       SampleIterator out, Distance n,

                       URBG&& g );
(1) (Library Fundamentals TS)
template< class PopulationIterator, class SampleIterator, class Distance >

SampleIterator sample( PopulationIterator first, PopulationIterator last,

                       SampleIterator out, Distance n );
(2) (Library Fundamentals TS v2)

シーケンスfirstからlastまでの範囲からn個の要素を選択し、それぞれの可能なサンプルが等しい確率で出現するようにします。選択された要素は出力イテレータoutに書き込まれます。

もしnがシーケンスの要素数より大きい場合、last - first個の要素が選択されます。

アルゴリズムが安定するのは、PopulationIteratorLegacyForwardIteratorの要件を満たす場合のみです。

1)乱数は乱数生成器gを使用して生成されます。
2)乱数はスレッドローカルなエンジンを使用して生成されます。

目次

[編集] パラメータ

first, last - サンプリング元の範囲(母集団)を形成するイテレータのペア。
out - サンプルが書き込まれる出力イテレータ。範囲firstからlastの範囲内であってはなりません。
n - 生成するサンプルの数。
g - ランダム性のソースとして使用される乱数ジェネレータ
-
PopulationIteratorLegacyInputIteratorの要件を満たす必要があります。
-
SampleIteratorLegacyOutputIteratorの要件を満たす必要があります。
-
PopulationIteratorLegacyForwardIteratorの要件を満たさない場合、SampleIteratorLegacyRandomAccessIteratorの要件も満たす必要があります。
-
PopulationIteratorの値型はoutに書き込み可能である必要があります。
-
Distanceは整数型である必要があります。
-
URBGUniformRandomBitGeneratorの要件を満たす必要があり、その戻り値の型は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)
範囲内の要素をランダムに並べ替える
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)