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 time模块详解(常用函数实例讲解,非常好)
Apr 24 Python
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
简单介绍Python中的几种数据类型
Jan 02 Python
Python之文字转图片方法
May 10 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
flask-restful使用总结
Dec 04 Python
django组合搜索实现过程详解(附代码)
Aug 06 Python
Python异常原理及异常捕捉实现过程解析
Mar 25 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 Python
python3中for循环踩过的坑记录
Dec 14 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 Python
Python中requests库的用法详解
Jun 05 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
php学习 函数 课件
2008/06/15 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
laravel5.6实现数值转换
2019/10/23 PHP
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
三八活动策划方案
2014/08/17 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
国庆节慰问信
2015/02/15 职场文书
财务总监岗位职责范本
2015/04/03 职场文书