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实现的二叉树算法和kmp算法实例
Apr 25 Python
Linux RedHat下安装Python2.7开发环境
May 20 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
简单实现python进度条脚本
Dec 18 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
Apr 21 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
学生信息管理系统python版
Oct 17 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
python设置代理和添加镜像源的方法
Feb 14 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
python 批量下载bilibili视频的gui程序
Nov 20 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
wordpress之wp-settings.php
2007/08/17 PHP
PHP中$this和$that指针使用实例
2015/01/06 PHP
33道php常见面试题及答案
2015/07/06 PHP
php图片添加水印例子
2016/07/20 PHP
简述php环境搭建与配置
2016/12/05 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
jquery等待效果示例
2014/05/01 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
JavaScript中的pow()方法使用详解
2015/06/15 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
2019/09/21 jQuery
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
Python实现简单过滤文本段的方法
2017/05/24 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
python hough变换检测直线的实现方法
2019/07/12 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
少儿节目主持串词
2014/04/02 职场文书
班级活动总结格式
2014/08/30 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2019教师的学习计划
2019/06/25 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL