像python random.sample一样提升随机样本

时间:2013-04-04 06:46:10

标签: c++ python boost random random-sample

我正在尝试使用C ++来模仿python

random.sample(a_set, n_samples)

C ++函数,如

set<string> sample(set<string> input, int n_samples)

在写我自己之前,有没有图书馆这样做?我在电脑上增加了1.46。

2 个答案:

答案 0 :(得分:1)

您要解决的问题称为reservoir sampling。我试着谷歌搜索“水库采样c ++实现”。谷歌为我自动完成了查询,但粗略地浏览一下结果并没有显示出真正的库。

算法非常简单,自学成才很有趣,所以我推荐这样做。

答案 1 :(得分:1)

SGI's implementation of the STLrandom_samplerandom_sample_n个函数:

template <class InputIterator, class RandomAccessIterator>
Random AccessIterator random_sample(InputIterator first, InputIterator last,
                                    RandomAccessIterator ofirst,
                                    RandomAccessIterator olast) 

template <class ForwardIterator, class OutputIterator, class Distance>
OutputIterator random_sample_n(ForwardIterator first, ForwardIterator last,
                               OutputIterator out, Distance n)

random_sample_n随机将[first, last)范围内的元素样本复制到范围[out, out + n)中。输入范围中的每个元素在输出范围中最多出现一次,并且以均匀的概率选择样本。

不幸的是

  

Matt Austern提出了几种额外的算法(主要来自SGI标准库的原始STL实现)。其中有   random_samplerandom_sample_n

(来自N3925

  

在索菲亚 - 安提波利斯会议上考虑WG21后,Austern更新了该提案,制作了[N2666]。除了其他变化之外,他还撤回了抽样算法,因为“LWG担心它们可能不足以理解标准化......可能适合为TR2提出这些算法”。 LWG随后取得了稳固的成绩   共识(10-1,2 abs。)支持在未来的技术报告(现称为技术规范)中使用这些算法。

random_sample_n算法的一个版本已经进入了库基础知识TS并被称为std::experimental::sample,提案的最新版本N3925在2014 - 02年被采用但仍然没有但标准的一部分(可能在C ++ 17中)。

除了水库采样算法之外,您还可以查看由Donald Knuth在The中阐述的众所周知的算法S (“选择采样技术”)。计算机程序设计 - 第2卷 - §3.4.2。