Понимая, что мой первый ответ был довольно затруднительным в его математике, я создал новую идею. Я считаю, что алгоритм здесь подобен алгоритму некоторых других ответов, но эта реализация, по-видимому, подходит для «симпатичного» (если это соответствует простому) требованию вопроса:
def func(id):
rnd = random()
sum = 0
for row in d:
if row[0] == id:
sum = sum + row[2]
if rnd < sum:
return row[1]
Например, данные из OP будут выглядеть так:
< 0.2
возвращает первый элемент < 0.5
возвращает второй элемент < 1.0
) возвращает третий элемент