问题描述:
从N个样本中等概率抽取K个样本,其中N未知。
算法描述:
首先构建一个可容纳 个元素的数组,将序列的前 个元素放入数组中。然后从第 个元素开始,以 的概率(为当前遍历的样本数)来决定该元素是否被替换到数组中。 当遍历完所有元素之后,数组中剩下的元素即为所需抽取的样本。
leetcode 397中的实现如下:
static std::default_random_engine dre(time(0));
static std::uniform_int_distribution<int> uid;
for(int i = 0; i < nums_.size(); i++) {
if (nums_[i] == target){
++cnt;
std::uniform_int_distribution<int> uid(1, cnt);
if (uid(dre) == cnt)
idx = i;
}
}
return idx;
这里可以看作k=1的情况。