首先回答题主的问题:
1.抢红包真的是“靠手气”,在有限的次数内。实际抢红包经历已经告诉你了,如果次数足够多的话,每个人抢的金额在数学上是一样多的。
2.计算机不能生成真随机数,可以是伪随机数、赝随机数,微信红包采用的伪随机数,但是他是带有金额上限的,也就是每一次抢红包,他的红包剩余金额都是变化的。
3.微信红包是实时算出来的,不是预先分配好的,当然这是内存计算,不涉及数据库存储查询等耗时操作。
微信红包的实现算法细节描述用户发红包,从财付通拿到用户的金额数据,设置红包的个数、红包的金额、类型(随机或平均),保存这条数据入库的同时同步至redis(或者先入redis再存库),扣财付通的钱;
用户开始抢红包:比如50元10个红包,平均一个5元,那么随机金额就是0.01~10元。
当已经被抢5个红包总共30元之后,还剩20元余额和5个红包个数,那么第6个人的红包随机金额就是0.01~8元之间。每一个红包都会根据剩余金额和剩余个数来重新计算金额,但是要保证最后一个红包不得小于0.01元,而且最后一个红包不需要做任何计算,剩多少给多少。
每条红包数据增加一个计数器,原子操作剩余金额和剩余个数,避免冒领。
财付通做好每秒20万入账准备,实际效果只有8万笔每秒(TPS 8w/s)。
每个红包只有24小时有效期,超过24小时,没有抢完的红包返还发起人。
不会做到真正的随机,只是伪随机,无限次数演练的情况下理论上平均,遵循截尾正态分布。
金额最大的有两个,谁先抢到“谁手气最佳”。
大家还有哪些看法,欢迎评论区讨论交流~