关于抽奖概率
最近做一个抽奖系统,对现在已经有的抽奖系统关于概率的这个东西进行了一些了解。于是想想针对这样的一些抽奖概率作为一些说明:
首先我们来说说比较常见的随机概率:
这就好像我们说的,我有一百个乒乓,其中一个是红色。然后把这些放到一个盒子里面,然后你在进行摸。当你摸完一次以后,在把你摸到的乒乓放回到盒子里面,在进行摸。这些,你每次摸中红色球的概率都是1/100。于是这样就产生的一个问题,我们对奖品会变得不可控制。如果一个运气好,很有可能机会造成奖品还不够发送。如果运气不好,这些奖品永远都可能留在那里。
于是根据这种问题,又有一种方法,每一次我们摸中的球,不放回回去了。于是概率也就变成:1/100,1/99,1/98……。这样也就控制了中奖的人数。但是这样又会出现一个问题:作为开奖人我对抽奖时间是不可控的。很多商家希望的是我在每个时间段能发送相应的奖品回去,这样更能提高抽奖的热度。如果一个奖品很快我就发送出去出去了,后面来的人会很失望。
于是根据这个问题,又出现了一种方法。如果我们把奖品放到抽奖的数量上面去,那不就可以控制抽奖的时间和中奖的人数了。如果100次抽奖中,我想每隔10次就有一个中奖,于是,我就随机吧中奖的机会放到5,16,21…..这样的抽奖次数去。这样我就能控制抽奖人的那种心情。能把更多的人留在我这里进行抽奖。
现在我们来说说关于数据库设计:
列名 |
类型 |
说明 |
id |
int |
ID 自动增长列 |
OpporName |
varchar(30) |
设置的抽奖的名称(方面区分) |
PrizeID |
int |
奖品ID |
PrizeName |
varchar(255) |
奖品名称 |
PrizeNumber |
int |
奖品数量 |
OPNumberList |
varchar(2000) |
数量序列号 |
PTNum |
int |
已经抽中的数量 |
BeginDate |
datetime |
适用的开始时间 |
EndDate |
datetime |
适用的结束时间 |
ForeNumber |
int |
在前多少位里面进行选取 |
AreaID |
varchar(20) |
地区编号 |
UserID |
varchar(30) |
指定用户中奖 |
NowNumber |
int |
现在进行抽奖的人数 |
OrderID |
int |
奖品优先率 |
LotteryExp |
datetime |
领奖的有效时间 |
OneMaxPriz |
int |
每次中奖发放的奖品数量 |
states |
int |
状态 |
然后我们来说说相关的设计思路:
Id:不做说明
OpporName:主要是为了区分,例如针对一个奖品我还要进行时间段的区分。所以当设置的奖品多的时候,就不方便区分了。
PrizeID:奖品ID。
PrizeName:奖品名称。
PrizeNumber:奖品数量。(方便概率的计算,和奖品的统计。同时如果我对一个设置追加奖品的时候,能更好的使用)
OPNumberList:中奖的次数列表。这个是为了吧奖品设置到每次抽奖的次数上面去,如果数量不是很大,就用varchar类型。
PTNum:已经抽中的数量,这个也是方便,如果追加奖品能进行计算。同时可以计算奖品的剩余数量。
BeginDate:此抽奖概率适用开始时间。
EndDate:此抽奖概率适用结束时间。
ForeNumber:此次抽奖在前多少次抽奖里面进行选取。因为对于抽奖我们本身对某一时段的抽奖人数是不能拿确认的。一个小时里面,他有可能有100个人,或者有200个人。于是我们设置概率也就不能确认在多少,于是我们选择了在某个时段,前多少次抽奖里面进行选取。例如我在2-3点之间,一般来的人为100-500个人,如果当天来的人只有100个,那么我设置到102这样的次数上面,肯定奖品就只有轮空了。如果我们前100个人之间选,那么我的奖品肯定会配送出去的。
AreaID:适于于那些地区。
UserID:我指定抽中的为某个人。这个是为了某些公司有自己的托而进行的设置。
NowNumber:现在抽奖的次数。
OrderID:奖品的概率排序。如果我有多个奖品在一个时间进行了覆盖。我肯定要设置优先把那些奖品分配出去。
LotteryExp:领奖的有效时间。
OneMaxPriz:每次奖品中奖发放的数量。如果我们每次中奖给2张点卡,等等。
States:状态。概率状态。
创稿人:jacky.chow(周尚冬)
QQ: 982147279
博客:http://blog.csdn.net/jacky4955
如果大家有更多的建议,请大家多多沟通。