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实现baidu hi自动登录的代码
Feb 10 Python
Python的gevent框架的入门教程
Apr 29 Python
老生常谈python之鸭子类和多态
Jun 13 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
python+pandas分析nginx日志的实例
Apr 28 Python
python清除字符串中间空格的实例讲解
May 11 Python
Python3.6连接Oracle数据库的方法详解
May 18 Python
浅谈python实现Google翻译PDF,解决换行的问题
Nov 28 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 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
域名和cookie问题(域名后缀)
2012/10/10 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Python 制作糗事百科爬虫实例
2016/09/22 Python
Python pymongo模块常用操作分析
2018/09/01 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
Python tcp传输代码实例解析
2020/03/18 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
人事助理岗位职责
2013/11/18 职场文书
区三好学生主要事迹
2014/01/30 职场文书
司机职责范本
2014/03/08 职场文书
工作鉴定评语
2014/05/04 职场文书
责任心演讲稿
2014/05/14 职场文书
租房安全协议书
2014/08/20 职场文书
党课培训心得体会
2014/09/02 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
Django路由层如何获取正确的url
2021/07/15 Python
Go语言并发编程 sync.Once
2021/10/16 Golang
基于Python实现对比Exce的工具
2022/04/07 Python