别人抢红包,程序猿来探讨微信红包的算法实现
曾经在公司写过一个类似于微信抢红包的功能,当时由于不会写,各种纠结,虽然最终实现了功能,但也仅仅是实现功能而已,像腾讯这么牛的公司肯定不是那样的,那么腾讯是怎么实现的呢?一直很好奇,但一直不得要领,今天偶然发现一篇文章,作者用很简单的算法,算是比较完美的解决了这个问题,说是完美,因为该算法满足了: 1、每个人都要能够领取到红包; 2、每个人领取到的红包金额总和=总金额; 3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味; 4、算法一定要简单,不然对不起腾讯这个招牌; 但由于原文是Python写的(老夫的推测,因为老夫并不会Python,本文底部注有链接,感兴趣的可以看看),老夫改为由Java实现,当然介于水平,实现的可能并不好,写在这里算是抛砖引玉,如果有牛人写出来更好的,欢迎留言交流 package cn.bridgeli.hongbao; public class HongBao { public static void fenPei(double totalMoney, int totalPerson) { double min = 0.01; for (int i = 1; i < totalPerson; i++) { // 随机安全上限,同时扩大 100 倍 double safeTotal = ((totalMoney – (totalPerson – i) \* min) / (totalPerson – i)) \* 100; // 生成随机钱数 double money = Math.floor(Math.random() * safeTotal + 1.0) / 100; totalMoney -= money; System.out.println("第" + i + "个红包:" + money + " 元"); } System.out.println("第" + totalPerson + "个红包:" + roundDouble(totalMoney) + " 元"); } // 四舍五入 private static Double roundDouble(double val) { Double ret = null; try { // 2 表示保留两位小数 double factor = Math.pow(10, 2); ret = Math.floor(val * factor + 0.5) / factor; } catch (Exception e) { e.printStackTrace(); } return ret; } } 参考资料:http://mp.weixin.qq.com/s?__biz=MjM5OTA1MDUyMA==&mid=204349860&idx=2&sn=0a3433ff34c08dca5c47f7d97301e118#rd