scipy.stats.rv_discrete
可能就是你想要的。你可以通过values参数提供概率。然后,你可以使用rvs()
分发对象的方法来生成随机数。
正如Eugene Pakhomov
在评论中指出的那样,你还可以将p关键字参数传递给numpy.random.choice()
,例如
numpy.random.choice(numpy.arange(1, 7), p=[0.1, 0.05, 0.05, 0.2, 0.4, 0.2])
从Python 3.6开始,Python的标准库中提供了一个解决方案random.choices
。
用法示例:让我们设置与OP的问题相匹配的总体和权重:
>>> 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})