python实现红包裂变算法


Posted in Python onFebruary 16, 2016

本文实例介绍了python实现红包裂变算法,分享给大家供大家参考,具体内容如下

Python语言库函数
安装:pip install redpackets
使用:

import redpackets
  
redpackets.split(total, num, min=0.01)

1、前情提要
过年期间支付宝红包、微信红包成了全民焦点,虽然大多数的红包就一块八角的样子,还是搞得大家乐此不疲。作为一名程序猿,自然会想了解下红包的实现细节,微信目前是没有公布红包的实现细节的,所以这里就综合网上的讨论通过 Python 来实现红包裂变。
2、红包规则

红包领了不少,据观察红包主要有以下几个限制条件:
所有人都能分到红包,也就是不会出现红包数值为 0 的情况
所有人的红包数值加起来等于支付的金额
红包波动范围比较大,约 5%~8% 的红包数值在平均值的两倍以上,同时数额 0.01 出现的概率比较高
红包的数值是随机的,并且数值的分布近似于正态分布
其中,前两条是最基本的限制条件,如果要求不是特别高,可以完全只考虑前两个限制条件即可。
3、裂变方式一
3.1、简单实现

def weixin_divide_hongbao(money, n):
  divide_table = [random.randint(1, 10000) for x in xrange(0, n)]
  sum_ = sum(divide_table)
  return [x*money/sum_ for x in divide_table]

3.2、相关问题
如使用该方式,需要自己去添加相关代码逻辑去处理如下问题
浮点数精度问题
边界值的处理

4、裂变方式二
4.1、完整实现

# -*- coding: utf-8 -*-
         
from decimal import Decimal, InvalidOperation
         
import random
         
         
def money_val(min, max):
  return min if min > max else Decimal(str(random.randint(min, max)))
         
         
def money_random(total, num, min=0.01):
  """
  :param total=10; # 红包总额 10 元
  :param num=8; # 分成 8 个红包,支持 8 人随机领取
  :param min=0.01; # 每个人最少能收到 0.01 元
  """
  money_list = []
         
  try:
    total = Decimal(str(total))
  except InvalidOperation as e:
    return money_list, e.message
         
  try:
    if isinstance(num, float) and int(num) != num:
      raise ValueError(u'Invalid value for Num: \'{0}\''.format(num))
    num = Decimal(str(int(num)))
  except ValueError as e:
    return money_list, e.message
         
  try:
    min = Decimal(str(min))
  except InvalidOperation as e:
    return money_list, e.message
         
  if total < num * min:
    return money_list, u'Invalid value for Total-{0}, Num-{1}, Min-{2}'.format(total, num, min)
         
  for i in xrange(1, num):
    safe_total = (total - (num - i) * min) / (num - i) # 随机安全上限
    money = money_val(min * 100, int(safe_total * 100)) / 100
    total -= money
    money_list.append(money)
  money_list.append(total)
         
  random.shuffle(money_list) # 随机打乱
         
  return money_list, u'Success'
         
         
if __name__ == '__main__':
  print money_random(1, 10)
  print money_random(0.1, 10)
  print money_random(0.11, 10)
  print money_random(0.12, 10)

4.2、函数使用
4.2.1、使用 money_random 预先将红包裂变,存放在 memcache 或者 redis 中

  • total —— 红包总额
  • num —— 裂变个数
  • min —— 非必须,红包最小面额,默认 0.01

4.2.2、当用户抢红包的时候,直接 pop 出来一个,直到将所有红包 pop 完
4.3、库使用说明
因为涉及到浮点运算,所以使用了 Decimal
5、源码示例
5.1、运行

python algorithm_utils.py

5.2、效果
5.2.1、对于如下几个示例

if __name__ == '__main__':
  print money_random(1, 10)
  print
  print money_random(0.1, 10)
  print
  print money_random(0.11, 10)
  print
  print money_random(0.12, 10)
  print

5.2.2、裂变后的红包列表如下

python实现红包裂变算法

以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。

Python 相关文章推荐
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
轻松实现python搭建微信公众平台
Feb 16 Python
Python探索之ModelForm代码详解
Oct 26 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
python 利用pandas将arff文件转csv文件的方法
Feb 12 Python
Django 自定义分页器的实现代码
Nov 24 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
python实现拼图小游戏
Feb 22 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
Jul 30 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
轻松实现python搭建微信公众平台
Feb 16 #Python
十条建议帮你提高Python编程效率
Feb 16 #Python
bpython 功能强大的Python shell
Feb 16 #Python
深入解读Python解析XML的几种方式
Feb 16 #Python
Python3.2模拟实现webqq登录
Feb 15 #Python
python编码最佳实践之总结
Feb 14 #Python
Python在Console下显示文本进度条的方法
Feb 14 #Python
You might like
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
django 消息框架 message使用详解
2019/07/22 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
《放小鸟》教学反思
2014/04/20 职场文书
法学院毕业生求职信
2014/06/25 职场文书
日语专业求职信
2014/07/04 职场文书
刮痧观后感
2015/06/05 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
python 常用的异步框架汇总整理
2021/06/18 Python