如何使用均匀随机数生成器从给定离散分布生成样本?
用均匀随机数从给定离散分布生成样本的方案
嘿,这个问题其实是离散分布抽样里最常用的逆变换抽样法的典型场景,我给你一步步拆解清楚怎么操作:
核心思路
逆变换抽样的逻辑很简单:把均匀随机数的区间和目标分布的累积概率区间一一对应,通过判断随机数落在哪个区间,就能得到对应的样本结果。
具体步骤
1. 计算累积分布函数(CDF)
先把每个结果的概率累加起来,得到每个结果对应的累积概率区间:
- 结果1:累积概率 = 0.34 → 对应区间
[0, 0.34) - 结果2:累积概率 = 0.34 + 0.10 = 0.44 → 对应区间
[0.34, 0.44) - 结果3:累积概率 = 0.44 + 0.05 = 0.49 → 对应区间
[0.44, 0.49) - 结果4:累积概率 = 0.49 + 0.13 = 0.62 → 对应区间
[0.49, 0.62) - 结果5:累积概率 = 0.62 + 0.13 = 0.75 → 对应区间
[0.62, 0.75) - 结果6:累积概率 = 0.75 + 0.25 = 1.00 → 对应区间
[0.75, 1.00)
2. 生成均匀随机数
用你的随机数生成器生成一个范围在 [0, 1) 之间的均匀随机数,记为 U。
3. 匹配区间得到样本
判断 U 落在哪个累积概率区间里,对应的结果就是你要的样本:
- 如果
U < 0.34→ 输出1 - 如果
0.34 ≤ U < 0.44→ 输出2 - 如果
0.44 ≤ U < 0.49→ 输出3 - 如果
0.49 ≤ U < 0.62→ 输出4 - 如果
0.62 ≤ U < 0.75→ 输出5 - 如果
U ≥ 0.75→ 输出6
伪代码实现
给你写个简单的伪代码示例,方便你理解:
def sample_from_distribution(): # 生成[0,1)的均匀随机数 U = generate_uniform_random(0, 1) if U < 0.34: return 1 elif U < 0.44: return 2 elif U < 0.49: return 3 elif U < 0.62: return 4 elif U < 0.75: return 5 else: return 6
额外说明
这个方法的优势是简单直观、通用性强,不管你的离散分布有多少个结果,都能直接套用。如果你的样本量特别大,或者结果数量很多,可以把累积概率存在数组里,用二分查找来匹配区间,能提升一点效率,但对于你这个只有6个结果的分布,直接顺序判断完全够用啦。
内容的提问来源于stack exchange,提问作者Derrick Jones
相关产品推荐
相关产品推荐

