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正则表达式re模块详细介绍
May 29 Python
python 容器总结整理
Apr 04 Python
对Python进行数据分析_关于Package的安装问题
May 22 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
python for循环输入一个矩阵的实例
Nov 14 Python
python实现在一个画布上画多个子图
Jan 19 Python
Python多线程获取返回值代码实例
Feb 17 Python
Python中全局变量和局部变量的理解与区别
Feb 07 Python
python基础之爬虫入门
May 10 Python
Python3接口性能测试实例代码
Jun 20 Python
Python道路车道线检测的实现
Jun 27 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
星际原理概述
2020/03/04 星际争霸
缅甸的咖啡简史
2021/03/04 咖啡文化
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
js鼠标左右键 键盘值小结
2010/06/11 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
JavaScript创建对象方法实例小结
2018/09/03 Javascript
使用JavaScript破解web
2018/09/28 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
Python3中关于cookie的创建与保存
2018/10/21 Python
python实现转圈打印矩阵
2019/03/02 Python
Django 内置权限扩展案例详解
2019/03/04 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
python字符串的index和find的区别详解
2020/06/20 Python
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
应用英语专业自荐信
2014/01/26 职场文书
小学数学课后反思
2014/04/23 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
长城英文导游词
2015/01/30 职场文书
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers