参考:

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

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

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

我的早期逻辑猜想?

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

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

逻辑代码:

 <?php

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

不才之见,欢迎吐槽。

红包算法思考和总结 -- by jason.zhi的更多相关文章

  1. 多维算法思考(三):AB组合问题

    多维算法思考(三):AB组合问题 题目:x个A,y个B可以组合成多少个不同排列的问题. 首先,我们用数学的方式思考,这个问题属于<组合数学>的问题,我们的第一种方法可以用组合思路来求解. ...

  2. PHP随机红包算法

    2017年1月14日 14:19:14 星期六 一, 整体设计 算法有很多种, 可以自行选择, 主要的"架构" 是这样的, 用redis decr()命令去限流, 用mysql去记 ...

  3. php 固定红包 + 随机红包算法

    <?php /** * 随机红包+固定红包算法[策略模式] * copyright (c) 2016 http://blog.csdn.net/CleverCode */ //配置传输数据DTO ...

  4. 微信红包算法TEST

    1.基本算法 设定总金额为10元,有N个人随机领取:N=1 则红包金额=X元: N=2 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数 第二个红包=10-第一个红包金 ...

  5. php红包算法函数[优化]

    php红包算法 <?php header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10000; ...

  6. php微信红包算法

    微信红包算法.php /**生成红包的函数*/ function getRandMoney($totalMoney, $totalPeople=2, $miniMoney=1){ $randRemai ...

  7. PHP实现简易微信红包算法

    <?php /** * PHP实现简易的微信红包算法 * @version v1.0 * @author quetiezheng */ function getMoney($total, $pe ...

  8. JAVA实现拼手气红包算法

    实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...

  9. 分布式唯一id:snowflake算法思考

    匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...

随机推荐

  1. C++类型转化

    dynamic_cast在多继承中可以判断无关类之间是否可以转换,例如基类B1和基类B2之间,static_cast可以在隐式转化及其逆转换中进行,但不允许无关类型之间的转换.,dynamic_cas ...

  2. TagHighlight

    :UpdateTypesFile 命令会生成相应的上色高亮文件(生成的着色文件可以叫types_c.taghl)还有相应的tags文件,寻找tags或taghl_config.txt确定project ...

  3. IOS键盘收起

    1.点击Return按扭时收起键盘 - (BOOL)textFieldShouldReturn:(UITextField *)textField { return [textField resignF ...

  4. apk反编译(8)如何完全防止反编译?

    在android 的应用很难做到完全防止反编译,即使用ProGuard混淆的后,也能得到smali代码,这个语法也很简单,很容易理解. 只能通过增加破解难度和成本,使破解者失去耐心. 其中一个常见解决 ...

  5. Python之格式化输出讲解

    1.格式化输出整数python print也支持参数格式化,与C言的printf似, strHello = "the length of (%s) is %d" %(Hello W ...

  6. Android Studio设置,鼠标放上去有提示

    设置如下: 1. 2. 勾选就可以了

  7. Instruments-查看收集到的数据

    由于Xcode调试工具Instruments指南篇幅太长,所以本篇blog继续上篇,介绍对Instruments收集到的数据去分析. 关于数据分析 Instruments不解决你代码中的任何问题,它帮 ...

  8. Qt之自定义界面(右下角冒泡)

    简述 网页右下角上经常会出现一些提示性的信息,桌面软件中也比较常见,类似360新闻.QQ消息提示一样! 这种功能用动画实现起来很简单,这节我们暂时使用定时器来实现,后面章节会对动画框架进行详细讲解. ...

  9. UVa 10943 (数学 递推) How do you add?

    将K个不超过N的非负整数加起来,使它们的和为N,一共有多少种方法. 设d(i, j)表示j个不超过i的非负整数之和为i的方法数. d(i, j) = sum{ d(k, j-1) | 0 ≤ k ≤ ...

  10. jquery图表插件morris.js参数详解和highcharts图表插件

    一.morris.js 优点:轻巧.简单好用 缺点:没highcharts功能多,常用的足以 网址:http://morrisjs.github.io/morris.js/ 核心代码 1.head调用 ...