本方法的原理是把所有權(quán)重的數(shù)值相加得到一個(gè)權(quán)重的總和,然后在 1 到總和之間隨機(jī)選取一個(gè)整數(shù)。把權(quán)重由小到大按升序排列,依此把權(quán)重相加,直到大于或等于選取的隨機(jī)數(shù)為止,此時(shí)記相機(jī)次數(shù)為n,列表的第 n-1 項(xiàng)即為輸出的加權(quán)隨即項(xiàng)。
# 選項(xiàng)
list = ['A', 'B', 'C']
# 權(quán)重,升序排列
weighted = [1, 2, 4]
def weighted_random(list, weighted):
# 從1到權(quán)重之和間隨機(jī)抽取一個(gè)整數(shù)
r = random.randint(1, sum(weighted))
# 把權(quán)重依此相加,直到大于或等于隨機(jī)數(shù)r,相加的次數(shù)記為n,跳出循環(huán)
# 從選項(xiàng)列表中取 n-1 位作為輸出的加權(quán)隨機(jī)數(shù)
c = 0
for index, w in enumerate(weighted):
c = c + w
if c >= r:
return (list[index])
break
可以用以下代碼驗(yàn)證下本方法:
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"))