最近一次面试被问到一个概率抽奖的问题,记录一下,题目是:实现一个抽奖系统,抽到一等奖的概率为10%,二等奖的概率为20%,三等奖的概率为30%,四等奖的概率为40%。
写出来之后,又让我写一个测试代码,跑1000次,看结果概率是否接近。
作为前端入门的代码萌新,遇到这种问题,只能临场发挥,从来没写过后台的逻辑~
下面是代码:
let _prize = ['A','B','C','D'] //奖项
let _prop = [1, 2, 3, 4] //权重
let a = 0, b = 0, c = 0, d = 0; //统计抽到每个奖的次数
let count = 0; //统计测试次数
//根据奖项和权重生成奖池(如果奖项少,概率简单,可以不用这一步,直接手写奖池)
let generatePool = (prize, prop) => {
let pool = [];
for (let i = 0; i < prop.length; i++) {
for (let j = 0; j < prop[i]; j++){
pool.push(prize[i])
}
}
return pool
}
let newPool = generatePool(_prize, _prop) //生成此次奖池
let poolLen = newPool.length //奖池容量
//抽奖
let getPrize = () => {
let random = Math.floor(Math.random() * poolLen) //奖池容量里的一个随机数
switch (newPool[random]){
case 'A':
a++
break
case 'B':
b++
break
c