Начиная с Python 3.6, есть решение для этого в стандартной библиотеке Python, а именно random.choices
.
Пример использования: давайте настроим совокупность и веса, соответствующие тем, которые указаны в вопросе ОП:
>>> from random import choices
>>> population = [1, 2, 3, 4, 5, 6]
>>> weights = [0.1, 0.05, 0.05, 0.2, 0.4, 0.2]
Теперь choices(population, weights)
генерирует один образец:
>>> choices(population, weights)
4
Необязательный аргумент только для ключевого слова k
позволяет запрашивать более одного образца одновременно. Это ценно, потому что есть некоторая подготовительная работа, которую random.choices
должен выполнять каждый раз, когда он вызывается, перед генерацией каких-либо сэмплов; генерируя много образцов одновременно, мы должны выполнить подготовительную работу только один раз. Здесь мы генерируем миллион выборок и используем collections.Counter
, чтобы проверить, что полученное нами распределение примерно соответствует весам, которые мы дали.
>>> million_samples = choices(population, weights, k=10**6)
>>> from collections import Counter
>>> Counter(million_samples)
Counter({5: 399616, 6: 200387, 4: 200117, 1: 99636, 3: 50219, 2: 50025})