Namespaces
Variants

std::experimental:: sample

From cppreference.net
定义于头文件 <experimental/algorithm>
template < class PopulationIterator, class SampleIterator,

class Distance, class URBG >
SampleIterator sample ( PopulationIterator first, PopulationIterator last,
SampleIterator out, Distance n,

URBG && g ) ;
(1) (库基础 TS)
template < class PopulationIterator, class SampleIterator, class Distance >

SampleIterator sample ( PopulationIterator first, PopulationIterator last,

SampleIterator out, Distance n ) ;
(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

另请参阅

(until C++17) (C++11)
随机重排范围内的元素
(函数模板)