問題描述:
從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的情況。