提前统计好参与的人数,初始化奖池,放入redis set中,通过spop随机弹出,抽完即扔,如果是中奖区间内的号码则中奖!

解密端午抽奖实现逻辑:

首先抽奖的前提肯定是:

  1. 保证在抽奖奖池抽完后,将奖品刚刚好发完,并且每个人都抽过奖。
  2. 每个人中奖的概率是一样的。

实现:
提前统计参与抽奖的人,形成一个数组,比如2600人抽奖,初始化好一个 2600长度的 数组,丢进redis,比如有50个人可以中奖,就将号码牌<50的抽奖号视为中奖。

redis 中spop的实现抽奖

调用 intsetRandom 函数, 从整数集合中随机取出一个元素, 在将这个随机元素返回给客户端之后, 调用 intsetRemove 函数, 将随机元素从整数集合中删除掉。调用 dictGetRandomKey 函数, 从字典中随机取出一个字典键, 在将这个随机字典键的值返回给客户端之后, 调用 dictDelete 函数, 从字典中删除随机字典键所对应的键值对。

验证每个人的公平程度:
假设有2600个人抽奖,有50个中奖卡牌,抽奖后将卡牌丢弃。

第一个人抽奖中奖概率: 50/2600

第二个人中奖概率 :

(50/2600) (49/2599) + (2550/2600)(50/2599)=50/2600

可以验证得到中奖概率一致是公平的。

03-05 22:13