我有一个文件,其中包含不同值的一些概率,例如:
1 0.1
2 0.05
3 0.05
4 0.2
5 0.4
6 0.2
我想使用这个分布生成随机数。是否存在处理此问题的现有模块?自己编写代码相当简单(构建累积密度函数,生成随机值 [0,1] 并选择相应的值),但这似乎应该是一个常见问题,可能有人已经为它。
我需要这个,因为我想生成一个生日列表(不遵循标准 random
模块中的任何分布)。
原文由 pafcu 发布,翻译遵循 CC BY-SA 4.0 许可协议
从 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)
生成一个样本,包含在长度为 1 的列表中:
>>> 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})
原文由 Mark Dickinson 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
scipy.stats.rv_discrete
可能是你想要的。您可以通过values
参数提供您的概率。然后可以使用分发对象的rvs()
方法来生成随机数。正如 Eugene Pakhomov 在评论中指出的那样,您还可以将
p
关键字参数传递给numpy.random.choice()
,例如如果您使用的是 Python 3.6 或更高版本,则可以使用标准库中的
random.choices()
- 请参阅 Mark Dickinson 的答案。