随机取样算法

本文部分源自[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)的算法复杂度而不是寄希望于运气.

          随机组合取样:

Code

 

          随机排列取样:

Code

 

 

-------------------------------------------------------------------------------------------

Ref:

[1] More Programming Pearls, Confessions of a coder. By Jon Bentley. Chapter 13.

posted @ 2009-06-03 04:17  Tyrael  阅读(826)  评论(0编辑  收藏  举报