基于权重的随机数JS实现

最近项目中需要实现一个基于权重的抽奖功能。例如抽中物品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 ;
};

再补充一点:如果需求是奖池类型的,对每个奖品的获取数量是有限的,超过限制的默认为鼓励奖的话。可以这样去实现:

  1. 当前二等奖中奖率 = 当前中二等奖奖品总数 / 当前抽奖总数  
  2. if(当前二等奖中奖率 < 配置概率)  
  3. // 可以中二等奖奖品  
  4. else  
  5. // 二等奖奖品已经中完,默认给中安慰奖

例:
    当前中二等奖奖品总数: 26
    当前抽奖总数:87
    当前二等奖中奖率 = 26 / 87 = 0.2988 = 29.88%
    0.2988 < 0.3
    结果:中奖

例:
    当前中二等奖奖品总数: 27
    当前抽奖总数:87
    当前二等奖中奖率 = 27 / 87 = 0.3103 = 31.03%
    0.3103 > 0.3
    结果:已经不能再中奖,默认给安慰奖


版权声明:本文为xjtroddy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。