微信红包随机金额算法

xiaoxiao2021-02-28  141

前段时间参加闺蜜婚礼,结果我们作为姐妹团没抢到红包,新郎看我们没有抢到红包就在微信群里发了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;  } 结论: 先抢后抢拿到红包的大小的期望是大致相等的,所以还是先下手抢吧 后抢的人方差大(依赖前面人抢的多少),波动较大,有较大几率拿到“手气最佳”
转载请注明原文地址: https://www.6miu.com/read-43865.html

最新回复(0)