std::experimental::sample
來自 cppreference.com
定義於標頭檔案 <experimental/algorithm> |
||
template< class PopulationIterator, class SampleIterator, class Distance, class URBG > |
(1) | (庫基礎 TS) |
template< class PopulationIterator, class SampleIterator, class Distance > SampleIterator sample( PopulationIterator first, PopulationIterator last, |
(2) | (庫基礎 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 的要求。 | ||
-如果 PopulationIterator 不滿足 LegacyForwardIterator,則 SampleIterator 也必須滿足 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
[編輯] 另請參閱
(C++17 前)(C++11) |
隨機地重排一個範圍中的元素 (函式模板) |