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抓取京东商城手机列表url实例代码
Dec 18 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
EM算法的python实现的方法步骤
Jan 02 Python
一百多行python代码实现抢票助手
Sep 25 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
Python自动抢红包教程详解
Jun 11 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 Python
python绘制箱型图
Apr 27 Python
Django框架中模型的用法
Jun 10 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作的文本留言本的例子(二)
2006/10/09 PHP
PHP中,文件上传
2006/12/06 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
python实现用户登录系统
2016/05/21 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
高中毕业的自我鉴定
2013/12/09 职场文书
宿舍卫生检讨书
2014/01/16 职场文书
动员大会主持词
2014/03/20 职场文书
广告宣传策划方案
2014/05/21 职场文书
诚信贷款承诺书
2014/05/30 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
生活小常识广播稿
2015/08/19 职场文书
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python