Namespaces
Variants

std::sample

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジ上のアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
ソートおよび関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割済み範囲に対して)
集合操作 (ソート済み範囲に対して)
マージ操作 (ソート済み範囲に対して)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダ <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以上)
  • 型 T を std::remove_reference_t<URBG> としたとき、以下の条件のいずれかが満たされる:
  • T の戻り値型が Distance に変換可能でない。
(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)
範囲内の要素をランダムに並べ替える
(関数テンプレート & アルゴリズム関数オブジェクト)
シーケンスからN個のランダムな要素を選択する
(アルゴリズム関数オブジェクト)