问题描述:
从N个样本中等概率抽取K个样本,其中N未知。
算法描述:
首先构建一个可容纳
k
k
k 个元素的数组,将序列的前
k
k
k个元素放入数组中。然后从第
k
+
1
k+1
k+1 个元素开始,以
k
n
\frac{k}{n}
nk的概率(
n
n
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的情况。