You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加权随机洗牌后特定索引的元素概率及通用公式咨询

加权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在各位置的概率:

  1. 索引0(第1位):直接选中a的概率为3/(3+2+1) = 0.5(50%),与模拟结果一致。
  2. 索引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%),与模拟结果一致。
  3. 索引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%),与模拟结果一致。

简化说明

小规模数组可直接枚举所有子集和排列计算概率;大规模数组可通过动态规划递推,避免全量枚举。

内容的提问来源于stack exchange,提问作者Maxim Lopin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:10:04