如何在JS中编写符合特定抽奖规则的概率返回布尔值函数
解决方案
核心实现思路
- 前4次按自定义概率正常抽奖
- 第5次做保底逻辑:如果前4次均未中奖,第5次强制中奖,保证5次循环里至少1次返回true
- 奖品支持单独配置中奖概率,按权重加权随机抽取
完整代码
// 奖品配置:可自定义每个奖品的中奖概率,数值为概率分母,比如10000对应1/10000的中奖概率 const prizes = [ { name: '奖品1', probability: 10000 }, { name: '奖品2', probability: 5000 }, { name: '奖品3', probability: 1000 }, { name: '奖品4', probability: 500 }, { name: '奖品5', probability: 100 }, { name: '奖品6', probability: 50 }, { name: '奖品7', probability: 10 }, { name: '奖品8', probability: 5 } ] // 基础概率函数:传入概率分母,返回1/n概率的布尔值(true代表中奖) function prob(n) { return Math.floor(Math.random() * n) === 0 } // 按配置概率从奖品列表中随机抽取1个奖品 function drawPrize(prizeList) { // 计算所有奖品的总权重 const totalWeight = prizeList.reduce((sum, prize) => sum + 1 / prize.probability, 0) let randomVal = Math.random() * totalWeight for (const prize of prizeList) { randomVal -= 1 / prize.probability if (randomVal <= 0) return prize.name } // 兜底返回最后一个奖品 return prizeList[prizeList.length - 1].name } // 主函数:执行5次抽奖,保证至少1次中奖 function runLottery(baseProbability = 100) { let hasWon = false // 执行前4次抽奖 for (let i = 0; i < 4; i++) { const isWin = prob(baseProbability) if (isWin) { const winPrize = drawPrize(prizes) console.log(`第${i+1}次抽奖:中奖,获得${winPrize}`) hasWon = true } else { console.log(`第${i+1}次抽奖:未中奖`) } } // 第5次保底逻辑 const fifthWin = hasWon ? prob(baseProbability) : true if (fifthWin) { const winPrize = drawPrize(prizes) console.log(`第5次抽奖:中奖,获得${winPrize}`) return true } else { console.log(`第5次抽奖:未中奖`) return false } } // 测试:基础中奖概率设为1/100,执行抽奖 runLottery(100)
自定义调整说明
- 调整整体单次中奖概率:调用
runLottery时传入对应分母即可,比如要1/10000的基础中奖概率,就写runLottery(10000) - 调整单个奖品中奖概率:直接修改
prizes数组中对应奖品的probability值,数值越大中奖概率越低 - 如果更习惯用0~1的小数表示概率,可以替换
prob函数为以下实现:
// 传入0~1的概率值,比如1/10000传0.0001 function prob(rate) { return Math.random() < rate }
内容的提问来源于stack exchange,提问作者Yuri Alves
相关产品推荐
相关产品推荐

