zoukankan      html  css  js  c++  java
  • 红包算法思考和总结 -- by jason.zhi

    参考:

    http://mp.weixin.qq.com/s?__biz=MzI2NjA3NTc4Ng==&mid=402360599&idx=1&sn=69318b235e0e8b402d6fc566a3355af4&scene=0#wechat_redirect

    进入知乎《微信红包的随机算法是怎样实现的》查看更多人的算法。

     

    最近看到抢红包这么火,早就想尝试去把抢红包的功能试着去做一做了。刚好今天看到参考的网址,就产生了这一篇总结性的文章了。

    我的早期逻辑猜想?

    1. 发红包者在发红包的时候,内存中存放的是红包的总额和红包的个数。然后在用户点击“拆红包”的时候,向服务器接口请求,服务器逻辑给用户计算出一个随机值(红包多少钱?),返回给前端。依次类推。
    2. 每次计算随机值时,都是用剩余的钱数除剩余拆红包的人,得出一个平均值,利用这个平均值去平衡每一个抢红包的用户得到的钱。
    3. 并没有第三,谢谢。

    不过,看完参考的文章,思路还是有一定的改进的。在每个用户点击”拆红包”的时候,并没有像我想象中的那样去计算用户获得多少钱的红包,而是在发红包的时候(就是输入总额和红包个数,付款后并提交到服务器的时候),服务器就已经计算出每个红包的额度并存放到内存中了。那么当每个用户点击”拆红包”的时候,服务器直接就把”结果”(红包的数值)给前端就完成了一次领红包的操作了。从性能上看,这种方法明显优于我之前的想法,但是,从存储空间上分析,如果发的红包个数太多的话,就会非常消耗内存了。

    逻辑代码:

     1 <?php
     2 
     3 $total_money = 1000;//发红包的总额,单位:分
     4 $num = 8;//发红包的个数
     5 $min_money = 1;//每个人至少得到多少钱?
     6 
     7 for ($i = 1; $i <= $num; $i++) {
     8    if ($i == $num) {//最后一个红包就直接等于余额
     9       $money = $total_money;
    10       $total_money = 0;
    11    } else {
    12       //$max_money是整个算法比较重要的部分,这个数值将决定了红包活动的公平性。
    13       //这里只是比较简单的一种方式,如果真要当功能去做的话,这里的max_money值获取的算法肯定是要优化的。
    14       $max_money = $total_money / ($num-$i);// $total_money相当于整个红包的余额,$num-$i相当于剩下还有多少人没有领红包
    15       $money = mt_rand($min_money, $max_money);
    16       $total_money -= $money;
    17    }
    18    $money /= 100;
    19    $tmp = $total_money / 100;
    20    echo "第{$i}个红包的数值为{$money}元, 余额为: {$tmp}元
    ";

     不才之见,欢迎吐槽。

  • 相关阅读:
    MYSQL编码转换的问题latin1转utf8
    Java中的局部内部类
    Java中的抽象类和接口
    Java中的构造方法
    使用Java打印杨辉三角
    Java中的数组越界问题
    Java虚拟机中的内存分配
    关于iOS10 Xcode8真机测试项目出现的问题 "code signing is required for product type 'xxxxx' in SDK 'iOS 10.0"..
    Java语言的学习
    关于导航栏设置状态栏样式问题
  • 原文地址:https://www.cnblogs.com/lihuobao/p/5210921.html
Copyright © 2011-2022 走看看