0.0 <= x < total
. from random import random
from bisect import bisect
def weighted_choice(choices):
values, weights = zip(*choices)
total = 0
cum_weights = []
for w in weights:
total += w
cum_weights.append(total)
x = random() * total
i = bisect(cum_weights, x)
return values[i]
>>> weighted_choice([("WHITE",90), ("RED",8), ("GREEN",2)])
'WHITE'
Если вам нужно сделать несколько вариантов, разделите их на две функции: одну для построения кумулятивных весов и другую для деления пополам на случайную точку.
Он работал после очистки кеша и удаления данных приложения.