Вы можете использовать random.randrange
, чтобы нарисовать значение между 0 и суммой всех значений dict, используйте itertools.accumulate
, чтобы сгенерировать последовательность кумулятивных сумм из значений, а затем используйте itertools.dropwhile
, чтобы найти первый совокупныйсумма, которая не меньше, чем ничья, и верните ключ dict по этому индексу, сопровождаемый кумулятивной суммой с использованием enumerate
:
import random
from itertools import accumulate, dropwhile
def pick(d):
draw = random.randrange(sum(d.values()))
return list(d.keys())[next(dropwhile(lambda t: t[1] < draw, enumerate(accumulate(d.values()))))[0]]
, так что:
from collections import Counter
d = {'A': 10, 'B': 30, 'C': 60}
print(Counter(pick(d) for _ in range(1000)))
может выводить:
Counter({'C': 587, 'B': 286, 'A': 127})