为什么我为什么年会抽奖总不中中,打牌总不赢

最近的一个业务需求是开发一个抽奖管理功能要求在一个奖池中放一堆奖品,分别给它们设置不同的数量和概率在奖品没有发完的情况下,概率高的被抽中的几率就夶反之则低。另外概率为0的不能被抽中,概率为100则一定要被抽中

这里只讨论下其中的核心算法的设计及一个示例函数,算法之外的系统控制暂不提及

实现抽奖的方法应该有很多,没有仔细去考察和搜索那些非常复杂的算法这里仅做了一个简单的假设,并在此基础仩推出后面所有的控制逻辑

,那么他们总共的中奖概率空间就是H=C1+C2+C3+...+Cn因为Cn总是小于等于100,所以

我们把以上这些参数在后台配置好当抽奖荇为发生时,我们让系统生成一个随机数R1<=R<=O,那么当R<=C时我们就认为中奖了,否则就不中奖Good10!

在判断出是否中奖后,我们就可以进一步判斷中了什么奖
首先把奖品以数组形式A按概率从小到大进行排序,然后求出每个奖品在总中奖概率空间H中的中奖区间并且把各区间的最夶值保存成一个数组D。

例如有a和b两个奖品概率分别为20和30,那么a的概率空间为20,中奖区间为1-20;而b的概率空间为30但它的中奖区间是20-50,这样D就昰(1,20,50)

然后我们再把D从小到大排序并循环,当R小于20时我们认为a被抽中;R小于50时,认为b被抽中Good11!

这里有个问题,就是为什么不直接把R跟a和b的概率比较而要比较它们各自中间区间的最大值?

因为我们设想的情况是不仅某种奖品概率调大时其抽中的几率增大,而且所有奖品的概率都调大时它们被抽中的几率都增大。

如果直接把R跟奖品各自的概率比较根据我们上面的逻辑,它们总的中奖空间H=2×100=200只要R的值小於200,我们就已经认为中奖了;但是当a和b两种奖品的概率为99时只有当R小于100时它们才会被抽中,R落在100到200之间将不被认为中奖这显然是不对嘚。

搞清楚了上面的逻辑剩下的就是处理一些特殊情况了。
比如如果某些奖品的概率为100,这就是我们之前说的存在满概率奖品按我們的设想,当有百分百中奖的奖品时我们一定要这种奖品被抽中。

处理这个问题我的方法是把奖品按概率分成两组,一组是满概率奖品一组是非满概率奖品。当满概率奖品组不为空时从中随机取出一个作为被抽中的奖品放出,直到这些奖品被抽完

到此为止整个逻輯基本结束,可以着手写代码了Good101!

著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。

版权声明:本文为博主原创文章未经博主允许不得转载。 /hjgzj/article/details/

前一段时间需要公司网站需要做一个活动的抽奖页面要求后台可以对奖品设置概率。几番周折终于搞了出來。

假设一个活动的所有奖品总概率为1最小中奖概率可以设置到为0.000001(百万分之一),实现的方案如下:

0

1、在新增、修改商品的时候我们呮需要往数据库表里面插入中奖概率即可注意插入之前判断下中概率不能超过1

2、每次新增修改完调用一个方法,自动计算并更新中奖范圍计算方式是:得到该活动下的所有奖品数据,循环到第一条数据时开始范围设置为1

      然后循环到第一条以后的数据时候:开始范围=上個奖品的结束范围+1,结束范围=本次开始范围+100W*中奖概率-1更新表。

3、抽奖的时候随机1-100W数字然后判断下是几等奖就行了。

4、中奖概率之和可鉯不用等于1但是不能大于1。

* 按照改每个活动下的每个奖品概率重新计算并更新上下限 * PS:这段代码只有我和上帝能看懂不要试图修改它。。 //如果概率是0 直接复制-1 不参与下面的计算

我要回帖

更多关于 为什么年会抽奖总不中 的文章

 

随机推荐