以下说明均为简要说明,略去大量细节,仅供理论学习之用。
一. 表结构说明
“ITEM_ID” NUMBER, //奖品项编号
“ITEM_NAME” NVARCHAR2(50),//奖品项名称
“SUM” NUMBER, //该奖品项的总数量
“MAX4DAY” NUMBER, //一天可出奖的最大输了
“ISDEFAULT” NUMBER DEFAULT 0, //是否是默认中奖项(必须有且仅可有一条记录)
“SUM_CURRENT” NUMBER DEFAULT 0, //当前已出奖数量
“SUM_DAY_CURRENT” NUMBER DEFAULT 0, //当日已出奖数量
“RATE” NUMBER(38,8) //中奖率
二. 原理及中奖率设置说明
(数据仅为示例)
我们假设有10个奖品项目,分别为奖品1-10,示例中奖率设置如下:
我们假设有10个奖品项目,分别为奖品1-10,示例中奖率设置如下:
奖品1—0.05
奖品2—0.05
奖品3—0.4
奖品4—0.6
奖品5—0.1
奖品6—0.1
奖品7—0.1
奖品8—0.15
奖品9—0.2
奖品10—默认
程序的中奖流程逻辑:
1. 定义一个足够大的数值如:10000 (实际为了更精确的控制中奖率,数值会远比这个数值更大);
2. 随机生成一个大于1而小于上面定义的最大值的整数。(要注意随机函数是否真的随机,可以用IP或时间戳做随机数的初始化(java)),我们假定此次生成的数字: 521;
2. 随机生成一个大于1而小于上面定义的最大值的整数。(要注意随机函数是否真的随机,可以用IP或时间戳做随机数的初始化(java)),我们假定此次生成的数字: 521;
3. 判断获得的随机数字对应的中奖区间,依据奖项中奖率和流程1中定义的最大值,可以很容易得到 521 对应 奖品2 的中奖区域;
4. 判断奖品是否可以出奖,如不符合条件,则给用户默认奖 (大多数为:谢谢参与)、
5. 展示给用户中奖结果
三.可能出现的问题
这里也是程序可以改进的地方
1. 中奖率合计大于1 ,会导致按id排序后大于1后的部分奖品项失效
2. 单项奖品出奖数量超越允许的最大,虽然程序在逻辑上已经控制了风险,不过为了客户感知,还是建议每天及时查看调整中奖率
1. 中奖率合计大于1 ,会导致按id排序后大于1后的部分奖品项失效
2. 单项奖品出奖数量超越允许的最大,虽然程序在逻辑上已经控制了风险,不过为了客户感知,还是建议每天及时查看调整中奖率
Tags: 抽奖
发表评论