别人抢红包,程序猿来探讨微信红包的算法实现
曾经在公司写过一个类似于微信抢红包的功能,当时由于不会写,各种纠结,虽然最终实现了功能,但也仅仅是实现功能而已,像腾讯这么牛的公司肯定不是那样的,那么腾讯是怎么实现的呢?一直很好奇,但一直不得要领,今天偶然发现一篇文章,作者用很简单的算法,算是比较完美的解决了这个问题,说是完美,因为该算法满足了:
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
全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/147
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/147
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论