微信红包随机金额算法

  前段时间参加闺蜜婚礼,结果我们作为姐妹团没抢到红包,新郎看我们没有抢到红包就在微信群里发了200元的红包。只可惜当时因为我的手机被盗所以并没有立即去抢,而是坐火车回到学校后补完手机卡才进去看看还能不能领到红包,结果就剩一个,而且金额78还是最大的。看来可能是看我手机丢了补偿我点儿。不过这个随机金额到底是怎么分配的,我看了知乎上有人说是这样:
比如100元,由10个人分,那么平均一个人是10元钱。然后付款后,系统开始分份儿。
第一份:系统由0~10元之间随机一个数,作为这一份的钱数,设x1。
第二份:剩下的钱(100-x1),系统由0~(100-x1)/(10-1)随机一个数,作为这份的钱数,设x2
.。。。
第n份:剩下的钱(100-x1-x2-...-xn),系统由0~(100-x1-x2-...-xn-1)/(10-n)随机一个数,作为这个份的钱数,设为xn

当用户进来拿红包的时候,系统由0~9之间随机一个数,随机到几,就取第几份红包,然后将这个数存到list里。当之后的用户抽到相同的随机数时,则将这个数+1,如遇相同再+1,直至list满,红包发完。
我觉得应该差不多,毕竟咱也不是微信内部的人啊。看代码:
public static double getRandomMoney(LeftMoneyPackage _leftMoneyPackage) {     
// remainSize 剩余的红包数量    
 // remainMoney 剩余的钱    
 if (_leftMoneyPackage.remainSize == 1)
 {         
_leftMoneyPackage.remainSize--;        
 return (double) Math.round(_leftMoneyPackage.remainMoney * 100) / 100;    
 }    
 Random r     = new Random();     
double min   = 0.01; //     
double max   = _leftMoneyPackage.remainMoney / _leftMoneyPackage.remainSize * 2;     
double money = r.nextDouble() * max;     
money = money <= min ? 0.01: money;     
money = Math.floor(money * 100) / 100;     
_leftMoneyPackage.remainSize--;     
_leftMoneyPackage.remainMoney -= money;    
 return money; 
}
结论: 先抢后抢拿到红包的大小的期望是大致相等的,所以还是先下手抢吧 后抢的人方差大(依赖前面人抢的多少),波动较大,有较大几率拿到“手气最佳”

你可能感兴趣的:(javademo)