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中模块与包有相同名字的处理方法
May 05 Python
Python配置mysql的教程(推荐)
Oct 13 Python
彻底理解Python list切片原理
Oct 27 Python
使用python实现BLAST
Feb 12 Python
python读取文本绘制动态速度曲线
Jun 21 Python
深入了解Django中间件及其方法
Jul 26 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
Python内存映射文件读写方式
Apr 24 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
python3中TQDM库安装及使用详解
Nov 18 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目录函数实现创建、读取目录教程实例
2011/01/13 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
asp批量修改记录的代码
2008/06/25 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
解决python 输出是省略号的问题
2018/04/19 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
金智子午JAVA面试题
2015/09/04 面试题
幼儿园见习报告范文
2014/10/30 职场文书
百年校庆感言
2015/08/01 职场文书
学校教代会开幕词
2016/03/04 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
MySQL里面的子查询的基本使用
2021/08/02 MySQL