随机取样算法
本文部分源自[1].
1. 背景, 放回与不放回抽样
1.1 问题描述:
M个数中随机抽取N次(N<=M), 取到M(K)(0<=K<M)的概率?
1.2 分析:
A,B为互斥事件, 则P(A+B) = P(A) + P(B).
1.2.1, 对于放回抽样, N次抽样后抽到任一数的概率是(1 - N次皆未取到的概率), 即: [1 - (m-1)/m]n.
因为是放回抽样, 所以有可能N次结果中有多次抽中, 即不互斥, 若累加单次概率, 有可能多次重复计算.
1.2.2, 对于不放回抽样, 概率为[(1/m) * 1 + (m-1)/m * 1/(m-1) * 1 + ...], 即: n/m.
不放回抽样, 互斥, 可以累加单次概率.
2. 随机取样算法
2.1 问题描述:
M个数中随机取N个数.
2.2 分析:
单次都是不放回取样.
最简单的办法就是查看每次取得的数是否已经取过. 当m == n并且比较大的时候, 在已经取出m-1个数的情况下希望取得剩下的唯一数时, 普通算法的中止只是理论上的, 我们需要关于O(m,n)的算法复杂度而不是寄希望于运气.
随机组合取样:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
随机排列取样:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
-------------------------------------------------------------------------------------------
Ref:
[1] More Programming Pearls, Confessions of a coder. By Jon Bentley. Chapter 13.