【发布时间】:2016-09-19 21:35:12
【问题描述】:
我知道问题标题含糊不清。我很抱歉。我有一个具有键的哈希图:值<string>:<list of lists>。对于给定的列表,列表中的每个项目都有相应的被选中概率。例如,哈希图中的一项可能看起来像
"NP":[['A', 'B'], ['C', 'D', 'E'], ['F']]
我需要随机选择右侧的列表之一。每个列表都有它自己的概率。这是将在地图中生成上述项目的输入字符串。
3 NP A B
1 NP C D E
1 NP F
因为NP A B旁边有数字3,NP C D E旁边有1,NP F旁边有1,所以概率比是3:1: 1,所以[A, B] 有 3/5 的概率被选中,[C, D, E] 有 1/5 的概率被选中,[F 的概率相同。
我的问题是,我如何模拟这些概率?
在引入这些数字之前,这很容易,因为我可以计算列表的长度(在上面的示例中为 3),然后选择一个介于 0 和 len(list) - 1 之间的随机数和 random.randint(),然后选择列表中的那个索引。要模拟伯努利随机变量,我知道可以检查if random.randint() < p。但这仅在您有 2 个案例时才有效。我无法明确编写 if 语句来检查,因为列表可能包含 n 元素。
【问题讨论】:
-
使用numpy.random.choice 很简单。如果您不想使用 numpy,则必须实现自己的离散采样算法。查看 wiki 以获取一些想法。 alias-algorithm 是一个很好但更难实现的算法,但您也可以使用二分搜索(甚至线性搜索)来实现。
-
是的,很遗憾我不能使用用户需要安装的 numpy 或库
-
参见 Eli Bendersky 的 Weighted random generation in Python。
-
@StevenRumbalski 所以在那篇文章中我传入的
weights列表在我的示例中是[3, 1, 1]或[60, 20, 20],其中每个元素都是从[(3/5)*100, (1/5)*100, (1/5)*100]计算出来的
标签: python probability