1. 程式人生 > >9.7 蓄水池演算法

9.7 蓄水池演算法

題目】:

  有一個機器按自然數序列的方式吐出球(1號球,2號球,3號球, ......),你有一個袋子,袋子最多隻能裝下K個球,並且除袋子以外,你沒有更多的空間。設計一種選擇方式,使得當機器吐出第N號球的時候(N>K),你袋子中的球數是K個,同時可以保證從1號球到N號球中的每一個,被選進袋子的概率都是K/N。舉一個更具體的例子,有一個只能裝下10個球的袋子,當吐出100個球時,袋子裡有10個球,並且1~100號中的每一個球被選中的概率都是10/100,然後繼續吐球,當吐出1000個球時,袋子裡有10個球,並且1~1000號中的每一個球被選中的概率都是10/1000,繼續吐球,當吐出i個球時,袋子裡有10個球,並且1~i號中的每一個球被選中的概率都是10/i,即吐球的同時,已經吐出的球被選中的概率也動態地變化

 

題目及思路來源:左程雲老師《程式設計師程式碼面試指南》