蓄水池抽样
之前也有写过从随机N条记录中选取M个随机记录的算法,但当时考虑的是N已知情形。(http://www.cnblogs.com/liyuxia713/archive/2012/05/25/2540709.html)
若N未知,该怎么办呢? 有个算法是 蓄水池抽样算法,reservoir sample。
什么情况下N未知呢? 比如记录个数特别多,在用集群处理的时候~
方法介绍参考:http://handspeaker.iteye.com/blog/1167092
下面是awk实现:
#!/bin/sh awk -F '\t' ' BEGIN{ sample_num=100000 idx = 0; } { idx=idx+1; query = $1 if ( idx <= sample_num ) { reservoir[idx] = query } else { rand_num = random_int(1,idx); if ( rand_num < sample_num ) { reservoir[rand_num] = query; } } } END{ for ( i=1; i <= sample_num; ++i ) { print reservoir[i] } } function random_int(min,max){ return int( rand()*(max-min+1) + min) }'
转载请注明出处: http://www.cnblogs.com/liyuxia713/