std::sample

来自cppreference.com
< cpp‎ | algorithm
 
 
算法库
受约束算法及范围上的算法 (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 起)
  • 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 个元素
(niebloid)