有人问过微信的人,大致是这样:
先上代码:
public static double getRandomMoney(RedPackage _redPackage) {// remainSize 剩余的红包数量// remainMoney 剩余的钱if (_redPackage.remainSize == 1) {_redPackage.remainSize--;return (double) Math.round(_redPackage.remainMoney * 100) / 100;}Random r = new Random();double min = 0.01; //double max = _redPackage.remainMoney / _redPackage.remainSize * 2;double money = r.nextDouble() * max;money = money <= min ? 0.01: money;money = Math.floor(money * 100) / 100;_redPackage.remainSize--;_redPackage.remainMoney -= money;return money;}
以上代码仅供参考,涉及商业计算要用java.math.BigDecimal. 感谢@xin lu、@秦时明月指出。
再说结论:
先抢后抢拿到红包的大小的期望是大致相等的,所以还是先下手抢吧后抢的人方差大(依赖前面人抢的多少),波动较大,有较大几率拿到“手气最佳”
祝大家抢红包快乐哦~
测试数据。
测试结果测试随机红包
以上面的初始化数据(30人抢500块),执行了两次,结果如下:
// 第一次15.69 21.18 24.11 30.85 0.74 20.85 2.96 13.43 11.12 24.87 1.86 19.62 5.97 29.33 3.05 26.94 18.69 34.47 9.4 29.83 5.17 24.67 17.09 29.96 6.77 5.79 0.34 23.89 40.44 0.92// 第二次10.44 18.01 17.01 21.07 11.87 4.78 30.14 32.05 16.68 20.