共计 555 个字符,预计需要花费 2 分钟才能阅读完成。
提前统计好参加的人数,初始化奖池,放入 redis set 中,通过 spop 随机弹出,抽完即扔,如果是中奖区间内的号码则中奖!
解密端午抽奖实现逻辑:
首先抽奖的前提必定是:
- 保障在抽奖奖池抽完后,将奖品刚刚好发完,并且每个人都抽过奖。
- 每个人中奖的概率是一样的。
实现:
提前统计参加抽奖的人,造成一个数组,比方 2600 人抽奖,初始化好一个 2600 长度的 数组,丢进 redis,比方有 50 集体能够中奖,就将号码牌 <50 的抽奖号视为中奖。
redis 中 spop 的实现抽奖
intset 编码的实现办法 | hashtable 编码的实现办法 |
---|---|
调用 intsetRandom 函数,从整数汇合中随机取出一个元素,在将这个随机元素返回给客户端之后,调用 intsetRemove 函数,将随机元素从整数汇合中删除掉。 | 调用 dictGetRandomKey 函数,从字典中随机取出一个字典键,在将这个随机字典键的值返回给客户端之后,调用 dictDelete 函数,从字典中删除随机字典键所对应的键值对。 |
验证每个人的偏心水平:
假如有 2600 集体抽奖,有 50 个中奖卡牌,抽奖后将卡牌抛弃。
第一个人抽奖中奖概率:50/2600
第二个人中奖概率 :
(50/2600) (49/2599) + (2550/2600)(50/2599)=50/2600
能够验证失去中奖概率统一是偏心的。
正文完