我有这样的数据:
d = (
(701, 1, 0.2),
(701, 2, 0.3),
(701, 3, 0.5),
(702, 1, 0.2),
(702, 2, 0.3),
(703, 3, 0.5)
)
其中(701,1,0.2)=(ID1,ID2,优先级)
如果我知道ID1,有没有一个很好的选择ID2的方法,使用优先级?
func(701)应返回:
_1-20%情况下
2-30%
_3-50%
当然,百分比会比较粗糙
最佳答案
为每个ID1生成一个累积分布函数,因此:
cdfs = defaultdict()
for id1,id2,val in d:
prevtotal = cdfs[id1][-1][0]
newtotal = prevtotal + val
cdfs[id1].append( (newtotal,id2) )
所以你会
cdfs = { 701 : [ (0.2,1), (0.5,2), (1.0,3) ],
702 : [ (0.2,1), (0.5,2) ],
703 : [ (0.5,3) ] }
然后生成一个随机数并在列表中搜索它。
def func(id1):
max = cdfs[id1][-1][0]
rand = random.random()*max
for upper,id2 in cdfs[id1]:
if upper>rand:
return id2
return None
关于python - 随机加权选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2073235/