本文实例介绍了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 qq红包_python实现红包裂变算法相关推荐

  1. python爬虫爬微信红包_python 微信红包

    def redbags(money, num=10): import random choice = random.sample(range(1, money * 100), num - 1) cho ...

  2. python微信红包_python 微信红包

    def redbags(money, num=10): import random choice = random.sample(range(1, money * 100), num - 1) cho ...

  3. python随机发红包_python 微信红包随机金额

    直接上代码吧 # -*- coding: utf-8 -*- from decimal import Decimal, InvalidOperation import random def money ...

  4. python联机麻将_python麻将和牌算法

    #coding='utf-8' #麻将胡牌算法 #判定规则:n*(abc)+m*(ddd)+ee #特殊牌型:7*(ee),7对. ##规则: ##胡牌的基础牌型: ##(1)11.123.123.1 ...

  5. python 数学公式识别_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  6. 用python求期望_Python——EM(期望极大算法)教学(附详细代码与注解)

    今天,我们详细的讲一下EM算法. 前提准备 Jupyter notebook 或 Pycharm 火狐浏览器或谷歌浏览器 win7或win10电脑一台 网盘提取csv数据 需求分析 实现高斯混合模型的 ...

  7. python兔子编程_Python兔子生兔子算法,编程练习题实例十一

    Python兔子生兔子算法,编程练习题实例十一 Python兔子生兔子算法,编程练习题实例十一 没学习python之前就听说过一个兔子生兔子的数学算法问题.现在学习了python编程后,自然要用pyt ...

  8. python时间序列峰值检测_Python中的峰值检测算法

    我正在Python中实现一个峰值检测算法,只检测那些高于阈值幅度的峰值.我不想使用内置函数,因为我必须将此模拟扩展到硬件实现. from math import sin,isnan from pyla ...

  9. python最佳身高_Python+sklearn使用线性回归算法预测儿童身高

    原标题:Python+sklearn使用线性回归算法预测儿童身高 问题描述:一个人的身高除了随年龄变大而增长之外,在一定程度上还受到遗传和饮食以及其他因素的影响,本文代码中假定受年龄.性别.父母身高. ...

最新文章

  1. vscode 这是一个好同志
  2. Intel Realsense D435 Realsense View 错误 RT IC2 Config error
  3. java sscanf_sscanf 详细说明
  4. 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适
  5. 如何把本地开发的 SAP UI5 应用部署到 ABAP 服务器上
  6. c++:json字符串拼接,json对象组装
  7. php保存ppt,ppt怎么保存到电脑桌面?
  8. 1078. Hashing (25)-PAT甲级真题
  9. Android之PopupWindow弹出对话框
  10. oracle函数 NLS_INITCAP(x[,y])
  11. 【测验8 编程题】: 程序设计方法学 (第8周)
  12. Octotree在GitHub中出错
  13. JPEG 图像压缩原理
  14. 信号转换 | 如何将正弦波转换成方波?
  15. Android之制作Nine-Patch图片
  16. xenu死链接工具使用
  17. UART串口通信软件推荐
  18. 威联通使用 HP 1020 Plus 打印机
  19. flutter_blue使用
  20. 钢铁侠的原型,oracle的创始人,天才企业家—拉里·埃里森

热门文章

  1. 微信禁止分享不完全解读
  2. CentOS7设置静态IP并成功上网
  3. 201808182326-利用shader对图片进行翻转(2)
  4. #pragma once 与 #define的含义及用法
  5. mysql ibdata1 作用_Mysql优化ibdata1大小
  6. 【Docker Desktop】Docker Desktop的安装与使用:
  7. Shader实例(流光实现)
  8. miui9如何不自动杀进程_小米MIUI 9官方没有告诉你的十大隐藏功能!
  9. Java虚拟机中类加载机制详解
  10. Buuctf Crpyto writeup --[GKCTF2020]小学生的密码学