std::sample

出自cppreference.com
 
 
算法庫
受約束算法及範圍上的算法 (C++20)
包含算法例如 ranges::copy, ranges::sort, ...
執行策略 (C++17)
排序和相關操作
劃分操作
排序操作
二分搜索操作(在已劃分範圍上)
集合操作(在有序範圍上)
歸併操作(在有序範圍上)
堆操作
最小/最大操作
(C++11)
(C++17)
字典序比較操作
排列操作
C 庫

數值運算
(C++11)                       
在未初始化內存上的操作
 
在標頭 <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 大於序列中的元素數量,那麼就會選擇序列中的所有元素。

算法只有在 PopulationIterator 滿足老式向前迭代器 (LegacyForwardIterator) 的要求時才穩定(保持被選擇元素的相對順序)。

如果 first 的值類型(C++20 前)*first(C++20 起)可寫入 out,那麼程序非良構。

如果滿足以下任意條件,那麼行為未定義:

(C++23 前)
(C++23 起)
  • 給定類型 Tstd::remove_reference_t<URBG>,滿足以下任意條件:
  • 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 << "从 " << in << " 中随机选取四个字母:" << out << '\n';
}

可能的輸出:

从 ABCDEFGHIJK 中随机选取四个字母:EFGK

參閱

(C++17 前)(C++11)
隨機重排範圍中元素
(函數模板) [編輯]
從序列中隨機選擇 N 個元素
(算法函數對象) [編輯]