##題目要求算法
從個元素中隨機抽取個元素,但的個數沒法事先肯定。 在實際應用中,每每會遇到很大數據流的狀況。所以,咱們沒法先保存整個數據流而後再從中選取,而是指望有一種將數據流遍歷一遍就獲得所選取的元素,而且保證獲得的元素是隨機的算法。dom
##蓄水池抽樣算法大數據
先選取個元素中的前個元素,保存在集合中; 從第個元素開始,每次先以機率選擇是否讓第個元素留下。若第個元素存活,則從中隨機選擇一個元素並用該元素替換它;不然直接淘汰該元素; 重複1和2,直到結束。最後集合中剩下的就是保證隨機抽取的個元素。code
##Java實現blog
public static BitSet randomBitSet(int size, int cardinality, Random rnd) { BitSet result = new BitSet(size); int[] chosen = new int[cardinality]; int i; for (i = 0; i < cardinality; ++i) { chosen[i] = i; result.set(i); } for (; i < size; ++i) { int j = rnd.nextInt(i + 1); if (j < cardinality) { result.clear(chosen[j]); result.set(i); chosen[j] = i; } } return result; }
調用實例ip
boolean result = randomBitSet(100, outOf100, new Random()).get(i);
##docsget