最近项目中需要实现一个基于权重的抽奖功能。例如抽中物品1的权重为2,抽中物品2的权重1。那么,物品1的概率就是1/3,物品2的概率就是2/3。
实现的主要思想,是基于数组实现的。
如下程序所示:如1的权重为1,则在数组中插入1个1,2的权重为2,则插入两个2。再对数组[1,2,2]进行随机拿去,就能实现基于权重的随机数了。
function weightRandom(curValue) {
var randomConfig = [{id:1,weight:2},{id:2,weight:1}];
var randomList = [];
for (var i in randomConfig) {
for (var j = 0; j < randomConfig[i].weight; j++) {
randomList.push(randomConfig[i].id);
}
}
var randomValue = randomList[Math.floor(Math.random() * randomList.length)];
if (curVal != 0) {
while (randomValue == curVal ) {
randomValue = randomList[Math.floor(Math.random() * randomList.length)];
}
}
return randomValue ;
};
再补充一点:如果需求是奖池类型的,对每个奖品的获取数量是有限的,超过限制的默认为鼓励奖的话。可以这样去实现: