擅长:python、mysql、java
<p>因为您知道iterable返回的数据的长度,所以可以使用<code>xrange()</code>快速生成iterable的索引。然后可以运行iterable,直到获取所有数据:</p>
<pre><code>import random
def sample(it, length, k):
indices = random.sample(xrange(length), k)
result = [None]*k
for index, datum in enumerate(it):
if index in indices:
result[indices.index(index)] = datum
return result
print sample(iter("abcd"), 4, 2)
</code></pre>
<p>另一种方法是使用“算法R”实现保留采样:</p>
^{pr2}$
<p>注意,算法R没有为结果提供随机顺序。在给定的示例中,<code>'b'</code>永远不会在结果中的<code>'a'</code>之前。</p>