std::sample
出自cppreference.com
| 在標頭 <algorithm> 定義
|
||
| |
(C++17 起) | |
從序列 [first, last)(不重複地)選擇 n 個元素,使得每個樣本擁有相等的出現概率,並將這些被選擇的元素寫入到輸出迭代器 out。用隨機數生成器 g 生成隨機數。
如果 n 大於序列中的元素數量,那麼就會選擇序列中的所有元素。
算法只有在 PopulationIterator 滿足老式向前迭代器 (LegacyForwardIterator) 的要求時才穩定(保持被選擇元素的相對順序)。
如果 first 的值類型(C++20 前)*first(C++20 起) 不可寫入 out,那麼程序非良構。
如果滿足以下任意條件,那麼行為未定義:
out在[first,last)中。PopulationIt不滿足老式輸入迭代器 (LegacyInputIterator) 的要求。SampleIt不滿足老式輸出迭代器 (LegacyOutputIterator) 的要求。- 滿足以下所有條件:
|
(C++23 前) |
|
(C++23 起) |
SampleIt不滿足老式隨機訪問迭代器 (LegacyRandomAccessIterator) 的要求。
- 給定類型
T為std::remove_reference_t<URBG>,滿足以下任意條件:
T不滿足均勻隨機位生成器 (UniformRandomBitGenerator) 的要求。
|
(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) |
隨機重排範圍中元素 (函數模板) |
(C++20) |
從序列中隨機選擇 N 個元素 (算法函數對象) |