基于权重的随机数JS实现
2016-05-24 10:42
549 查看
最近项目中需要实现一个基于权重的抽奖功能。例如抽中物品1的权重为2,抽中物品2的权重1。那么,物品1的概率就是1/3,物品2的概率就是2/3。
实现的主要思想,是基于数组实现的。
如下程序所示:如1的权重为1,则在数组中插入1个1,2的权重为2,则插入两个2。再对数组[1,2,2]进行随机拿去,就能实现基于权重的随机数了。
再补充一点:如果需求是奖池类型的,对每个奖品的获取数量是有限的,超过限制的默认为鼓励奖的话。可以这样去实现:
当前二等奖中奖率 = 当前中二等奖奖品总数 / 当前抽奖总数
if(当前二等奖中奖率 < 配置概率)
// 可以中二等奖奖品
else
// 二等奖奖品已经中完,默认给中安慰奖
例:
当前中二等奖奖品总数: 26
当前抽奖总数:87
当前二等奖中奖率 = 26 / 87 = 0.2988 = 29.88%
0.2988 < 0.3
结果:中奖
例:
当前中二等奖奖品总数: 27
当前抽奖总数:87
当前二等奖中奖率 = 27 / 87 = 0.3103 = 31.03%
0.3103 > 0.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 ; };
再补充一点:如果需求是奖池类型的,对每个奖品的获取数量是有限的,超过限制的默认为鼓励奖的话。可以这样去实现:
当前二等奖中奖率 = 当前中二等奖奖品总数 / 当前抽奖总数
if(当前二等奖中奖率 < 配置概率)
// 可以中二等奖奖品
else
// 二等奖奖品已经中完,默认给中安慰奖
例:
当前中二等奖奖品总数: 26
当前抽奖总数:87
当前二等奖中奖率 = 26 / 87 = 0.2988 = 29.88%
0.2988 < 0.3
结果:中奖
例:
当前中二等奖奖品总数: 27
当前抽奖总数:87
当前二等奖中奖率 = 27 / 87 = 0.3103 = 31.03%
0.3103 > 0.3
结果:已经不能再中奖,默认给安慰奖
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享