Грубый, но может быть достаточным:
import random
weighted_choice = lambda s : random.choice(sum(([v]*wt for v,wt in s),[]))
Работает ли это?
# define choices and relative weights
choices = [("WHITE",90), ("RED",8), ("GREEN",2)]
# initialize tally dict
tally = dict.fromkeys(choices, 0)
# tally up 1000 weighted choices
for i in xrange(1000):
tally[weighted_choice(choices)] += 1
print tally.items()
Отпечатки:
[('WHITE', 904), ('GREEN', 22), ('RED', 74)]
Предполагается, что все веса являются целыми числами. Им не нужно добавлять до 100, я просто сделал это, чтобы облегчить интерпретацию результатов теста. (Если веса являются числами с плавающей запятой, умножьте их на 10 раз, пока все веса> = 1.)
weights = [.6, .2, .001, .199]
while any(w < 1.0 for w in weights):
weights = [w*10 for w in weights]
weights = map(int, weights)
ОК, так что я, наконец, решил это сделать. Публикация здесь для будущих людей (включая меня;)):
Проблема заключалась в том, что Gradle был более строгим, чем Javac, при работе с обработчиками аннотаций, которые были необходимы для создания моего отсутствующего файла. В этом случае мне просто пришлось добавить обработчик аннотации Log4j в список зависимостей -> annotationProcessor.