<h2>马克·兰森回答的证据</h2>
<p>让我们用更容易思考的数字(至少对我来说!)公司名称:</p>
<ul>
<li>10项</li>
<li>删除其中3个</li>
</ul>
<p>第一次通过循环,我们将假设前三项被删除——概率如下:</p>
<ul>
<li>第一项:3/10=30%</li>
<li>第二项:2/9=22%</li>
<li>第三项:1/8=12%</li>
<li>第四项:0/7=0%</li>
<li>第五项:0/6=0%</li>
<li>第六项:0/5=0%</li>
<li>第七项:0/4=0%</li>
<li>第八项:0/3=0%</li>
<li>第九项:0/2=0%</li>
<li>第十项:0/1=0%</li>
</ul>
<p>正如你所看到的,一旦达到零,它就会保持在零。但是如果什么都没有被删除呢?在</p>
<ul>
<li>第一项:3/10=30%</li>
<li>第二项:3/9=33%</li>
<li>第三项:3/8=38%</li>
<li>第四项:3/7=43%</li>
<li>第五项:3/6=50%</li>
<li>第六项:3/5=60%</li>
<li>第七项:3/4=75%</li>
<li>第八项:3/3=100%</li>
<li>第九项:2/2=100%</li>
<li>第十项:1/1=100%</li>
</ul>
<p>所以,即使每行的概率不同,总的来说你会得到你想要的结果。我从一个有100万个项目的最终测试中删除了我自己的一个100万个测试项目:</p>
<pre><code># python 3.2
from __future__ import division
from stats import mean # http://pypi.python.org/pypi/stats
import random
counts = dict()
for i in range(100):
counts[i] = 0
removed_failed = 0
for _ in range(1000000):
to_remove = 7
from_list = list(range(100))
removed = 0
while from_list:
current = from_list.pop()
probability = to_remove / (len(from_list) + 1)
if random.random() < probability:
removed += 1
to_remove -= 1
counts[current] += 1
if removed != 7:
removed_failed += 1
print(counts[0], counts[1], counts[2], '...',
counts[49], counts[50], counts[51], '...',
counts[97], counts[98], counts[99])
print("remove failed: ", removed_failed)
print("min: ", min(counts.values()))
print("max: ", max(counts.values()))
print("mean: ", mean(counts.values()))
</code></pre>
<p>下面是我运行的几次中的一次得到的结果(它们都很相似):</p>
^{pr2}$
<p>最后一点:Python的<code>random.random()</code>是[0.0,1.0)(不包括1.0作为可能)。在</p>