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
相关产品推荐
相关产品推荐

