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设置windows桌面壁纸的实现代码
Jan 28 Python
从零学python系列之从文件读取和保存数据
May 23 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
Python基于pygame实现的font游戏字体(附源码)
Nov 11 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
python3库numpy数组属性的查看方法
Apr 17 Python
Python中存取文件的4种不同操作
Jul 02 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
python判断无向图环是否存在的示例
Nov 22 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
基于Python爬虫采集天气网实时信息
Jun 05 Python
python实现录音功能(可随时停止录音)
Oct 26 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
实现树状结构的两种方法
2006/10/09 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
原生js实现放大镜
2017/02/20 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
中学家长会邀请函
2014/01/17 职场文书
挂靠协议书范本
2014/04/22 职场文书
大学计划书范文800字
2014/08/14 职场文书
四风自我剖析材料
2014/09/30 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js