提前统计好参与的人数,初始化奖池,放入redis set中,通过spop随机弹出,抽完即扔,如果是中奖区间内的号码则中奖!
解密端午抽奖实现逻辑:
首先抽奖的前提肯定是:
- 保证在抽奖奖池抽完后,将奖品刚刚好发完,并且每个人都抽过奖。
- 每个人中奖的概率是一样的。
提前统计参与抽奖的人,形成一个数组,比如2600人抽奖,初始化好一个 2600长度的 数组,丢进redis,比如有50个人可以中奖,就将号码牌<50的抽奖号视为中奖。
【如何用set实现一个抽奖】redis 中spop的实现抽奖
intset 编码的实现方法 | hashtable 编码的实现方法 |
---|---|
调用 intsetRandom 函数, 从整数集合中随机取出一个元素, 在将这个随机元素返回给客户端之后, 调用 intsetRemove 函数, 将随机元素从整数集合中删除掉。 | 调用 dictGetRandomKey 函数, 从字典中随机取出一个字典键, 在将这个随机字典键的值返回给客户端之后, 调用 dictDelete 函数, 从字典中删除随机字典键所对应的键值对。 |
假设有2600个人抽奖,有50个中奖卡牌,抽奖后将卡牌丢弃。
第一个人抽奖中奖概率: 50/2600
第二个人中奖概率 :
(50/2600) (49/2599) + (2550/2600)(50/2599)=50/2600
可以验证得到中奖概率一致是公平的。