lst = [ ('Orange', 0.10), ('Apple', 0.05), ('Mango', 0.15), ('etc', 0.69) ]
x = 0.0
lst2 = []
for fruit, chance in lst:
tup = (x, fruit)
lst2.append(tup)
x += chance
tup = (x, None)
lst2.append(tup)
import random
def pick_one(lst2):
if lst2[0][1] is None:
raise ValueError, "no valid values to choose"
while True:
r = random.random()
for x, fruit in reversed(lst2):
if x <= r:
if fruit is None:
break # try again with a different random value
else:
return fruit
pick_one(lst2)
这将构建一个新的列表,其中升序值表示选择水果的值范围;然后pick_one()向后遍历列表,查找一个值,该值为<;=当前随机值。我们将一个“sentinel”值放在列表的末尾;如果值没有达到1.0,则有可能出现一个不应该与任何内容匹配的随机值,它将与sentinel值匹配,然后被拒绝。随机。随机()返回一个范围为[0.0,1.0)的随机值,因此它最终肯定会匹配列表中的某些内容。在
这里的好处是,你应该能够有一个匹配概率为0.000001的值,它实际上应该与这个频率相匹配;其他的解决方案是,列出一个重复使用的项目列表随机选择()若要选择一个,则需要一个包含一百万项的列表来处理此情况。在