名前空間
変種
操作

std::sample

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
sample
(C++17)

ソートおよび関連操作
パーティション操作
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
数値演算
未初期化メモリに対する操作
 
ヘッダー <algorithm> で定義
template< class PopulationIt, class SampleIt, class Distance, class URBG >

SampleIterator sample( PopulationIt first, PopulationIt last,

                       SampleIt out, Distance n, URBG&& g );
(C++17以降)

シーケンス [firstlast) から n 個の要素を(重複なしで)選択し、可能なすべてのサンプルが等しい確率で出現するようにし、選択された要素を出力イテレータ out に書き込みます。乱数は乱数ジェネレータ g を使用して生成されます。

n がシーケンス内の要素数より大きい場合、シーケンス内のすべての要素を選択します。

このアルゴリズムは、`PopulationIt` が LegacyForwardIterator の要件を満たしている場合にのみ安定です(選択された要素の相対順序を保持します)。

first の値型(C++20まで)*first(C++20以降)out書き込み可能でない場合、プログラムは不適格です。

次のいずれかの条件が満たされる場合、動作は未定義です。

  • out[firstlast) 内にあります。
  • `PopulationIt` は LegacyInputIterator の要件を満たしません。
  • `SampleIt` は LegacyOutputIterator の要件を満たしません。
  • 以下のすべての条件が満たされます
(C++23まで)
(C++23から)
  • `T` の戻り値の型は `Distance` に変換できません。
(C++20まで)

目次

[編集] パラメーター

first, last - サンプリング(母集団)を行う要素の範囲を定義するイテレータのペア
out - サンプルが書き込まれる出力イテレータ
n - 作成するサンプルの数
g - ランダム性のソースとして使用される乱数ジェネレータ
型要件
-
`Distance` は整数型でなければなりません。

[編集] 戻り値

最後に出力されたサンプルの後、つまりサンプル範囲の終わりにある out のコピーを返します。

[編集] 計算量

std::distance(first, last) に対して線形。

[編集] 可能な実装

libstdc++libc++、および MSVC STL の実装を参照してください。

[編集] 備考

この関数は、選択サンプリングまたはリザーバーサンプリングを実装する場合があります。

機能テストマクロ 規格 機能
__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個のランダムな要素を選択する
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)