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

JavaScript如何实现按指定概率权重从数组中随机抽取结果

JavaScript按指定概率返回数组元素的实现方案

核心实现逻辑是利用Math.random()生成[0,1)区间的均匀分布随机数,再把0-1的区间按概率占比拆分为多个子区间,匹配随机数落在的区间即可返回对应概率的结果。

完整实现代码

var data = ['win', 'lose', 'draw']
// 与数组元素按顺序一一对应的概率值,总和需为1
const weights = [0.5, 0.3, 0.2]

function getRandomResult() {
  const rand = Math.random()
  let cumulativeWeight = 0
  for (let i = 0; i < data.length; i++) {
    // 累加当前累计概率
    cumulativeWeight += weights[i]
    // 随机数落在当前区间则返回对应元素
    if (rand < cumulativeWeight) {
      return data[i]
    }
  }
  // 边界兜底,概率总和刚好为1时不会走到这里
  return data[data.length - 1]
}

逻辑说明

我们把0-1的区间按概率拆分为三段:

  • [0, 0.5):对应返回win,区间长度占比50%
  • [0.5, 0.8):对应返回lose,区间长度占比30%
  • [0.8, 1):对应返回draw,区间长度占比20%

Math.random()返回的随机数均匀分布在0-1之间,所以落到各个区间的概率刚好和我们设定的概率一致。

效果验证

可以运行多次统计结果验证概率准确性:

// 测试统计:运行10000次看结果占比
const count = {win:0, lose:0, draw:0}
for (let i = 0; i < 10000; i++) {
  const res = getRandomResult()
  count[res]++
}
console.log('win占比:', count.win/10000) // 约0.5
console.log('lose占比:', count.lose/10000) // 约0.3
console.log('draw占比:', count.draw/10000) // 约0.2

如果后续需要调整概率或者新增数组元素,只需要同步修改data数组和weights数组的对应项即可,不需要修改核心逻辑。

内容的提问来源于stack exchange,提问作者Arun Bohra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:45:00