本方法的原理是把所有权重的数值相加得到一个权重的总和,然后在 1 到总和之间随机选取一个整数。把权重由小到大按升序排列,依此把权重相加,直到大于或等于选取的随机数为止,此时记相机次数为n,列表的第 n-1 项即为输出的加权随即项。
# 选项
list = ['A', 'B', 'C']
# 权重,升序排列
weighted = [1, 2, 4]
def weighted_random(list, weighted):
# 从1到权重之和间随机抽取一个整数
r = random.randint(1, sum(weighted))
# 把权重依此相加,直到大于或等于随机数r,相加的次数记为n,跳出循环
# 从选项列表中取 n-1 位作为输出的加权随机数
c = 0
for index, w in enumerate(weighted):
c = c + w
if c >= r:
return (list[index])
break
可以用以下代码验证下本方法:
all = []
for i in range(700):
all.append(weighted_random(list, weighted))
print('A:', all.count("A"))
print('B:', all.count("B"))
print('C:', all.count("C"))