Задать вопрос
Dr_Elvis
@Dr_Elvis
В гугле забанен

Как работает random.choices с weights?

Допустим имеется такой список
a = [1, 2, 3, 4, 5]
А так же веса:
w = (1, 3, 7, 9, 80)
И код который выбирает значение:
random.choices(a, weights=w)
Как работает в процентном соотношении выбор из списка a?
Вес - это же не процентное соотношение того что выберется? То есть данный код не означает что в 80% случае выберется 5?
Как можно задать процентное соотношение выбора того или иного элемента списка через веса?
Без веса можно в принципе сделать так:
a = [1, 2, 3, 4, 5]
r = random.randint(1, 100)
if r <= 80:
    print(a[4])
elif r <= 89:
    print(a[3])
elif r <= 96:
    print(a[2])
elif r <= 99:
    print(a[1])
elif r <= 100:
    print(a[0])

Но есть ли способ сделать процентное соотношение проще? интересует только натив.
  • Вопрос задан
  • 1128 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 3
Vindicar
@Vindicar
RTFM!
В документации написано:
If a weights sequence is specified, selections are made according to the relative weights

Относительные веса означают, что если вес одного элемента вдвое больше другого, он будет выбран с двое большей вероятностью. Т.е. считай, что веса нормализуются - делятся на сумму весов, и полученные частные и будут вероятностями.
Ответ написан
Комментировать
@U235U235
Как раз таки данный код означает, что если сделать много-много выборок, то в 80% будет выбрано 5.
Ответ написан
Комментировать
Maksim_64
@Maksim_64
Data Analyst
Что бы трансформировать weights в вероятности вы каждый элемент делите на сумму weights. В вашем случае weights = (1,3,7,9,80). ваш пространство выборки a = [1,2,3,4,5], соответственно
1 : 1 / sum(weights)
2 : 3 / sum(weights)
3 : 7 / sum(weights)
4 : 9 / sum(weights)
5 : 80 / sum(weights)

Интерпретация: При большом количество реализаций эксперимента (большое количество выборок) в данной функции регулируется параметром k, ваша относительная частота будут СТРЕМИТСЯ к заданным вероятностям но не ПОЛНОСТЬЮ им соответствовать.
Например:
random.choice(['Red','Black'],[5,25], k=100)
вы получаете
Red: 5/30 = 1/5
Black: 4/5
за 100 реализаций эксперимента вы ОЖИДАЕТЕ.
Red: 100 * (1/5) = 20
Black: 80
вам на ГАРАНТИРОВАННЫ 20 и 80. Могут быть близкие к этим значения, могут быть 20 и 80. То есть количество будет варьироваться возле этих значений.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы