随机取样算法

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

          随机组合取样:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1// Do M times in a set having N objects
 2
 3Algs 1, recursion:
 4
 5Function Sample(M,N)
 6ExpandedBlockStart.gifContractedBlock.gif{
 7    if M = 0 then
 8        return the empty set
 9    else
10        S := Sample(M-1,N-1)
11        T := RandInt(1,N)
12        if T is not in S then 
13            insert T in S
14        else
15            insert N in S
16    return S
17}

18
19Algs 2, iteration:
20
21Function Sample(M,N)
22ExpandedBlockStart.gifContractedBlock.gif{
23    initialize set S to empty
24    for J := N - M + 1 to N do
25        T := RandInt(1,J)
26        if T is not in S then
27            insert T in S
28        else
29            insert J in S
30}

 

          随机排列取样:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1
 2Algs 3:
 3
 4Function SampleArray(M,N)
 5ExpandedBlockStart.gifContractedBlock.gif{
 6    initialize sequence S to empty
 7    for J := N -+ 1 to N do
 8        T = RandInt(1,J)
 9        if T is not in S then
10            prefix T to S
11        else
12            insert J in S after T
13}

 

 

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

Ref:

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

转载于:https://www.cnblogs.com/Tyrale/archive/2009/06/03/1494984.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值