##题目要求算法
从个元素中随机抽取个元素,但的个数没法事先肯定。 在实际应用中,每每会遇到很大数据流的状况。所以,咱们没法先保存整个数据流而后再从中选取,而是指望有一种将数据流遍历一遍就获得所选取的元素,而且保证获得的元素是随机的算法。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