使用scipy.stats.bernoulli模拟1/3概率与构造均匀离散分布是否可行
结论
仅使用scipy.stats提供的bernoulli相关函数完全可以实现你提到的所有需求,具体实现逻辑如下:
1. 模拟1/3概率的伯努利分布
该需求属于bernoulli函数的原生支持能力,直接设置分布参数p=1/3即可,生成的随机变量取1的概率为1/3,取0的概率为2/3:
from scipy.stats import bernoulli # 生成1000个服从p=1/3伯努利分布的样本 samples = bernoulli.rvs(p=1/3, size=1000)
2. 仅借助bernoulli.rvs()复现p=0.5的公平抛硬币
可以用冯·诺依曼去偏算法实现,哪怕你不直接设置p=0.5,仅用任意固定偏置的伯努利生成器也能得到公平抛硬币结果:
- 连续调用两次
bernoulli.rvs()得到两个结果 - 如果两次结果为
(0,1),输出0;如果为(1,0),输出1 - 如果两次结果为
(0,0)或(1,1),丢弃本次结果,重复上述步骤
该方法得到的0和1的概率严格等于50%,符合公平抛硬币要求。
示例代码:
def fair_coin(): while True: # 用任意非0/1的p参数都可以 a = bernoulli.rvs(p=1/3) b = bernoulli.rvs(p=1/3) if a != b: return a
3. 生成0、1、2的均匀离散分布
可以基于上述公平抛硬币的结果用拒绝采样实现:
- 用公平硬币生成2位二进制数,对应十进制的0~3
- 如果生成的结果是3,丢弃重抽
- 剩下的0、1、2三个结果概率完全相等,均为1/3
示例代码:
def uniform_012(): while True: bit0 = fair_coin() bit1 = fair_coin() num = bit1 * 2 + bit0 if num < 3: return num
内容的提问来源于stack exchange,提问作者vogalep737
相关产品推荐
相关产品推荐

