【发布时间】:2017-06-27 21:18:03
【问题描述】:
我正在编写需要根据给定概率或列表生成二进制结果的代码。我正在查看随机模块,但找不到任何可以解决问题的方法。
例子
30% 的时间返回 1
示例
45% 和 55% 的时间返回 1 或 0
【问题讨论】:
-
用什么语言?
-
Python 语言
我正在编写需要根据给定概率或列表生成二进制结果的代码。我正在查看随机模块,但找不到任何可以解决问题的方法。
例子
30% 的时间返回 1
示例
45% 和 55% 的时间返回 1 或 0
【问题讨论】:
生成一个 uniform(0,1) 随机值,检查它是否 ≤ 所需的比例/p 值,并相应地返回 0 或 1。假设rand 是一个 U(0,1) 生成器,伪代码如下所示:
function bernoulli(p) {
if rand <= p {
return 1
} else {
return 0
}
}
【讨论】:
random.choices 肯定会做你想做的事,但它可能有点矫枉过正。它可以从每个元素具有独立频率的有限集中生成任意长的选择序列。在链接的 Python 文档的示例部分中有一个使用示例:
>>> # Estimate the probability of getting 5 or more heads from 7 spins
>>> # of a biased coin that settles on heads 60% of the time.
>>> trial = lambda: choices('HT', cum_weights=(0.60, 1.00), k=7).count('H') >= 5
>>> sum(trial() for i in range(10000)) / 10000
0.4169
在该示例中,权重被指定为累积分布:
cum_weights=(0.60, 1.00)
如您的示例所示,使用单个权重的等效调用将是
weights=(0.60, 0.40)
权重之和不需要为 1;它们将被标准化。
【讨论】: