1. 程式人生 > >Reservoir Sampling

Reservoir Sampling

blog 可能 1-1 for col 四種 賦值 class 數組

ReservoirSample(S[1..n], R[1..k])
 
  for i = 1 to k
      R[i] := S[i] 
  for i = k+1 to n
    j := random(1, i)   
    if j <= k
        R[j] := S[i]

若S為1-10 , k=3,則R初始為1,2,3

i=4時,1-4隨機選取 4則1/4,1-3則3/4.

3, 將4賦值給R[j]->1,2,4

2->1,4,3

1->4,2,3

4->1,2,3

在1-4中隨機取3個數即以上四種情況,並且保證了每種情況概率為1/4.

以上為舉例,數學證明同理。

i=5時,從5個數中取3,每個數取到概率為3/5,而3個數組合為1/10。循環可能情況恰為(4+6) 次。

證明容易,難以想到。

Reservoir Sampling