擅长:python、mysql、java
<p>我假设所有的概率加起来都是1。如果他们不这样做,你就必须相应地调整他们的规模,这样他们才能做到。</p>
<p>首先使用<code>random.random()</code>生成一个均匀的随机变量[0,1]。然后通读一下这个清单,把概率加起来。第一次总和超过随机数时,返回关联的数字。这样,如果生成的均匀随机变量在示例中的范围(0.5,0.75)内,则返回2,从而使其返回所需的0.25概率。</p>
<pre><code>import random
import sys
def pick_random(prob_list):
r, s = random.random(), 0
for num in prob_list:
s += num[1]
if s >= r:
return num[0]
print >> sys.stderr, "Error: shouldn't get here"
</code></pre>
<p>下面的测试表明它是有效的:</p>
<pre><code>import collections
count = collections.defaultdict(int)
for i in xrange(10000):
count[pick_random(prob_list)] += 1
for n in count:
print n, count[n] / 10000.0
</code></pre>
<p>哪些输出:</p>
<pre><code>1 0.498
2 0.25
3 0.0515
4 0.0099
5 0.0899
6 0.1007
</code></pre>
<p>编辑:刚刚看到问题中的编辑。如果要选择两个不同的数字,可以重复上述步骤,直到选择的第二个数字是不同的。但是如果一个数字有很高的概率(例如0.9999999)与之相关,这将是非常缓慢的。在这种情况下,您可以从列表中删除第一个数字,然后重新调整概率,以便在选择第二个数字之前,它们的总和为1。</p>