首页 > 微信 > 别人抢红包,程序猿来探讨微信红包的算法实现

别人抢红包,程序猿来探讨微信红包的算法实现

曾经在公司写过一个类似于微信抢红包的功能,当时由于不会写,各种纠结,虽然最终实现了功能,但也仅仅是实现功能而已,像腾讯这么牛的公司肯定不是那样的,那么腾讯是怎么实现的呢?一直很好奇,但一直不得要领,今天偶然发现一篇文章,作者用很简单的算法,算是比较完美的解决了这个问题,说是完美,因为该算法满足了:

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

分享到:
作 者: BridgeLi,http://www.bridgeli.cn/
原文链接:https://www.bridgeli.cn/archives/147
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: 微信 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.