Namespaces
Variants

std::experimental:: sample

From cppreference.net
ヘッダー <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 個の要素を選択します。

このアルゴリズムが安定するのは、 PopulationIterator LegacyForwardIterator の要件を満たす場合に限ります。

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

目次

パラメータ

first, last - サンプリングを行う範囲を形成するイテレータのペア(母集団)
out - サンプルが書き込まれる出力イテレータ。範囲 [ first , last ) 内にあってはならない
n - 作成するサンプルの数
g - ランダム性のソースとして使用される乱数生成器
-
PopulationIterator LegacyInputIterator の要件を満たさなければならない
-
SampleIterator LegacyOutputIterator の要件を満たさなければならない
-
SampleIterator は、 PopulationIterator LegacyForwardIterator を満たさない場合、 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

関連項目

(until C++17) (C++11)
範囲内の要素をランダムに並べ替える
(関数テンプレート)