擅长:python、mysql、java
<p>如果您需要一个固定频率的原始迭代器的子集(即,如果生成器生成10000个数字,您希望“统计地”生成100个数字,如果它生成1000000个数字,则需要10000个数字—始终为1%),那么您应该将迭代器包装在一个构造中,生成概率为1%的内循环结果。在</p>
<p>因此,我想您需要的是一个固定数量的样本,这些样本来自于一个未知基数的源,就像您提到的Perl算法一样。在</p>
<p>您可以将迭代器包装在一个拥有自己的小内存的结构中,以便跟踪库,并以降低概率的方式循环它。在</p>
<pre><code>import random
def reservoir(iterator, size):
n = size
R = iterator[0:n]
for e in iterator:
j = random.randint(0, n-1)
n = n + 1
if (j < size):
R[j] = e
return R
</code></pre>
<p>所以</p>
^{pr2}$
<p>可能会打印出来</p>
<pre><code>[656, 774, 828]
</code></pre>
<p>我已经尝试生成100万发子弹,并用这个滤波器比较了三列的分布(我预期是高斯分布)。在</p>
<pre><code># get first column and clean it
python file.py | cut -f 1 -d " " | tr -cd "0-9\n" \
| sort | uniq -c | cut -b1-8 | tr -cd "0-9\n" | sort | uniq -c
</code></pre>
<p>虽然还不是真正的高斯分布,但在我看来已经足够好了。在</p>