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实现的重启关机程序实例
Aug 21 Python
详解Python中的各种函数的使用
May 24 Python
浅析python协程相关概念
Jan 20 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
浅谈tensorflow之内存暴涨问题
Feb 05 Python
Python enumerate内置库用法解析
Feb 24 Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 Python
Django之腾讯云短信的实现
Jun 12 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
Python基础之Socket通信原理
Apr 22 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
PHP缓存工具XCache安装与使用方法详解
2018/04/09 PHP
javascript天然的迭代器
2010/10/29 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
总结js函数相关知识点
2018/02/27 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
Python3基于sax解析xml操作示例
2018/05/22 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
大学自我鉴定范文
2013/12/26 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书
教师学习心得体会范文
2016/01/21 职场文书
《火烧云》教学反思
2016/02/23 职场文书
创业计划书之废品回收
2019/09/26 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis
python中的sys模块和os模块
2022/03/20 Python