Possible Duplicates:
Random weighted choice
Generate random numbers with a given (numerical) distribution
我有一个列表列表,其中包含一系列数字和相关概率。
prob_list = [[1, 0.5], [2, 0.25], [3, 0.05], [4, 0.01], [5, 0.09], [6, 0.1]]
例如,在 prob_list[0]
中,数字 1 的概率为 0.5。因此,您会期望 1 在 50% 的时间内出现。
如何在选择数字时增加权重?
注意:列表中的数字数量可以从 6 到 100 不等
编辑
在列表中,我有 6 个数字及其相关概率。我想根据概率选择两个数字。
没有数字可以被选择两次。如果选择了“2”,则无法再次选择。
我将假设所有概率加起来为 1。如果不是,您将不得不相应地调整它们以使其达到。
首先使用random.random()
生成一个统一的随机变量[0, 1]。然后遍历列表,对概率求和。总和第一次超过随机数时,返回关联数。这样,如果生成的均匀随机变量落在范围内 (0.5, 0.75] 在您的示例中,将返回 2,从而为其返回所需的 0.25 概率。
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"
这是一个显示它有效的测试:
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
哪些输出:
1 0.498
2 0.25
3 0.0515
4 0.0099
5 0.0899
6 0.1007
编辑:刚看到问题中的编辑。如果你想选择两个不同的数字,你可以重复上面的步骤,直到你选择的第二个数字是不同的。但是,如果一个数字具有非常高的概率(例如 0.99999999)与之关联,这将非常缓慢。在这种情况下,您可以从列表中删除第一个数字并重新调整概率,以便在选择第二个数字之前它们的总和为 1。