Python:选择具有相关概率的数字

标签 python random statistics probability

<分区>

Possible Duplicates:
Random weighted choice
Generate random numbers with a given (numerical) distribution

我有一个列表列表,其中包含一系列数字和相关概率。

prob_list = [[1, 0.5], [2, 0.25], [3, 0.05], [4, 0.01], [5, 0.09], [6, 0.1]]

例如,在 prob_list[0] 中,数字 1 的概率为 0.5。因此,您会期望 1 在 50% 的时间内出现。

如何在选择数字时增加权重?

注意:列表中的数字数量可以从 6 到 100 不等


编辑

在列表中,我有 6 个数字及其相关概率。我想根据概率选择两个数字。

没有数字可以被选择两次。如果选择了“2”,则无法再次选择。

最佳答案

我将假设所有概率加起来为 1。如果不是,您将不得不相应地调整它们以使其达到。

首先使用random.random()生成一个统一的随机变量[0, 1]。然后遍历列表,对概率求和。总和第一次超过随机数时,返回关联数。这样,如果生成的均匀随机变量落在范围内 (0.5, 0.75] 在您的示例中,将返回 2,从而为其返回所需的 0.25 概率。

import random
import sys
def pick_random(prob_list):
  r, s = random.random(), 0
  for num in prob_list:
    s += num[1]
    if s >= r:
      return num[0]
  print >> sys.stderr, "Error: shouldn't get here"

这是一个显示它有效的测试:

import collections
count = collections.defaultdict(int)
for i in xrange(10000):
  count[pick_random(prob_list)] += 1
for n in count:
  print n, count[n] / 10000.0

哪些输出:

1 0.498
2 0.25
3 0.0515
4 0.0099
5 0.0899
6 0.1007

编辑:刚看到问题中的编辑。如果你想选择两个不同的数字,你可以重复上面的步骤,直到你选择的第二个数字是不同的。但是,如果一个数字具有非常高的概率(例如 0.99999999)与之关联,这将非常缓慢。在这种情况下,您可以从列表中删除第一个数字并重新调整概率,以便在选择第二个数字之前它们的总和为 1。

关于Python:选择具有相关概率的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4276787/

相关文章:

python - 为什么 models.ForeignKey 有优势?

jquery - 如何添加淡入效果?

java - 处理 - 使物体在特定的时间帧内消失和出现

statistics - 将简单的 T 检验统计数据输出到 SAS 数据集

python - 使用 countvectorizer 和 tfidfvectorizer 作为特征向量使用 KMeans 进行文本聚类是否有意义?

python - 如何配置 matplotlib 以能够从本地路径读取字体?

python - 使用 Python 替换文件中的单词的问题

matlab - 创建两个不同随机整数的优雅方式

用于比较高级语言(例如 Javascript)的数据图形相似性的数学库?

algorithm - 计算大数据集分位数的增量方法