加权随机洗牌后特定索引的元素概率及通用公式咨询
加权Fisher-Yates洗牌中元素在指定位置的概率计算
核心结论
你提到的洗牌算法是加权Fisher-Yates洗牌(对应论文中的迭代式加权采样实现),核心逻辑是:每次从剩余元素中按权重比例随机选一个元素放到当前位置,再从剩余集合中移除该元素,重复直到所有元素排列完成。
对于元素A(权重为w_A)出现在索引i(0-based)的概率,存在通用计算方式,可通过分步概率求和推导。
通用计算公式推导
设:
- 总元素数为
n,所有元素的权重之和为W_total = sum(w_x for x in 所有元素) - 除A外的元素权重集合为
W_rest = {w_x | x ≠ A}
元素A出现在索引i的概率,等价于先从剩余元素中选出i个非A元素(任意顺序),再在第i+1步选中A的所有可能情况的概率之和,公式为:
P(A at i) = sum_{所有大小为i的非A元素子集S} [ (S中元素所有排列的概率乘积之和) × (w_A / (W_total - sum(S))) ]
其中,子集S的某一排列s_1, s_2, ..., s_i的概率乘积为:
(w_s1 / W_total) × (w_s2 / (W_total - w_s1)) × ... × (w_si / (W_total - w_s1 - ... - w_s(i-1)))
示例验证
以你给出的例子:数组['a','b','c'],权重[3,2,1],计算a在各位置的概率:
- 索引0(第1位):直接选中a的概率为
3/(3+2+1) = 0.5(50%),与模拟结果一致。 - 索引1(第2位):先选b或c,再选a:
- 先选b再选a:
(2/6) × (3/(6-2)) = 0.25 - 先选c再选a:
(1/6) × (3/(6-1)) = 0.1 - 总概率:
0.25 + 0.1 = 0.35(35%),与模拟结果一致。
- 先选b再选a:
- 索引2(第3位):先选b和c(两种顺序),再选a:
- 先选b再选c再选a:
(2/6) × (1/(6-2)) × (3/(6-2-1)) ≈ 0.0833 - 先选c再选b再选a:
(1/6) × (2/(6-1)) × (3/(6-1-2)) ≈ 0.0667 - 总概率:
0.0833 + 0.0667 = 0.15(15%),与模拟结果一致。
- 先选b再选c再选a:
简化说明
小规模数组可直接枚举所有子集和排列计算概率;大规模数组可通过动态规划递推,避免全量枚举。
内容的提问来源于stack exchange,提问作者Maxim Lopin
相关产品推荐
相关产品推荐

