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实现多线程采集的2个代码例子
Jul 07 Python
python通过BF算法实现关键词匹配的方法
Mar 13 Python
python实现bucket排序算法实例分析
May 04 Python
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
对python过滤器和lambda函数的用法详解
Jan 21 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
tensorflow多维张量计算实例
Feb 11 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
Sep 30 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/12/05 PHP
php实现图片缩放功能类
2013/12/18 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
javascript forEach通用循环遍历方法
2010/10/11 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
Vue中 key keep-alive的实现原理
2018/09/18 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
利用python写个下载teahour音频的小脚本
2017/05/08 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
windows环境下tensorflow安装过程详解
2018/03/30 Python
如何给Python代码进行加密
2020/01/10 Python
美国体育用品商店:Rally House(NCAA、NFL、MLB、NBA、NHL和MLS)
2018/01/03 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
警察思想汇报
2014/01/04 职场文书
2014年上半年工作自我评价
2014/01/18 职场文书
12岁生日感言
2014/01/21 职场文书
爱心募捐感谢信
2015/01/22 职场文书
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL