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下载懒人图库JavaScript特效
May 28 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
python中常用的九种预处理方法分享
Sep 11 Python
python3操作微信itchat实现发送图片
Feb 24 Python
python多线程扫描端口(线程池)
Sep 04 Python
python中sort sorted reverse reversed函数的区别说明
May 11 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
用python-webdriver实现自动填表的示例代码
Jan 13 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
取得父标签
2006/11/14 Javascript
可实现多表单提交的javascript函数
2007/08/01 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
vue.js的状态管理vuex中store的使用详解
2019/11/08 Javascript
微信小程序自定义弹出层效果
2020/05/26 Javascript
python连接sql server乱码的解决方法
2013/01/28 Python
python根据路径导入模块的方法
2014/09/30 Python
基于Python闭包及其作用域详解
2017/08/28 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
python3 flask实现文件上传功能
2020/03/20 Python
Django开发的简易留言板案例详解
2018/12/04 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
python实现图片中文字分割效果
2019/07/22 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
大数据分析用java还是Python
2020/07/06 Python
机关道德讲堂实施方案
2014/03/15 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
先进工作者事迹材料
2014/12/23 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书