python qq红包_python实现红包裂变算法
本文实例介绍了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 money_random(0.1, 10)
print money_random(0.11, 10)
print money_random(0.12, 10)
5.2.2、裂变后的红包列表如下
以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。
python qq红包_python实现红包裂变算法相关推荐
- python爬虫爬微信红包_python 微信红包
def redbags(money, num=10): import random choice = random.sample(range(1, money * 100), num - 1) cho ...
- python微信红包_python 微信红包
def redbags(money, num=10): import random choice = random.sample(range(1, money * 100), num - 1) cho ...
- python随机发红包_python 微信红包随机金额
直接上代码吧 # -*- coding: utf-8 -*- from decimal import Decimal, InvalidOperation import random def money ...
- python联机麻将_python麻将和牌算法
#coding='utf-8' #麻将胡牌算法 #判定规则:n*(abc)+m*(ddd)+ee #特殊牌型:7*(ee),7对. ##规则: ##胡牌的基础牌型: ##(1)11.123.123.1 ...
- python 数学公式识别_Python实现基于KNN算法的笔迹识别功能详解
本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...
- 用python求期望_Python——EM(期望极大算法)教学(附详细代码与注解)
今天,我们详细的讲一下EM算法. 前提准备 Jupyter notebook 或 Pycharm 火狐浏览器或谷歌浏览器 win7或win10电脑一台 网盘提取csv数据 需求分析 实现高斯混合模型的 ...
- python兔子编程_Python兔子生兔子算法,编程练习题实例十一
Python兔子生兔子算法,编程练习题实例十一 Python兔子生兔子算法,编程练习题实例十一 没学习python之前就听说过一个兔子生兔子的数学算法问题.现在学习了python编程后,自然要用pyt ...
- python时间序列峰值检测_Python中的峰值检测算法
我正在Python中实现一个峰值检测算法,只检测那些高于阈值幅度的峰值.我不想使用内置函数,因为我必须将此模拟扩展到硬件实现. from math import sin,isnan from pyla ...
- python最佳身高_Python+sklearn使用线性回归算法预测儿童身高
原标题:Python+sklearn使用线性回归算法预测儿童身高 问题描述:一个人的身高除了随年龄变大而增长之外,在一定程度上还受到遗传和饮食以及其他因素的影响,本文代码中假定受年龄.性别.父母身高. ...
最新文章
- vscode 这是一个好同志
- Intel Realsense D435 Realsense View 错误 RT IC2 Config error
- java sscanf_sscanf 详细说明
- 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适
- 如何把本地开发的 SAP UI5 应用部署到 ABAP 服务器上
- c++:json字符串拼接,json对象组装
- php保存ppt,ppt怎么保存到电脑桌面?
- 1078. Hashing (25)-PAT甲级真题
- Android之PopupWindow弹出对话框
- oracle函数 NLS_INITCAP(x[,y])
- 【测验8 编程题】: 程序设计方法学 (第8周)
- Octotree在GitHub中出错
- JPEG 图像压缩原理
- 信号转换 | 如何将正弦波转换成方波?
- Android之制作Nine-Patch图片
- xenu死链接工具使用
- UART串口通信软件推荐
- 威联通使用 HP 1020 Plus 打印机
- flutter_blue使用
- 钢铁侠的原型,oracle的创始人,天才企业家—拉里·埃里森
热门文章
- 微信禁止分享不完全解读
- CentOS7设置静态IP并成功上网
- 201808182326-利用shader对图片进行翻转(2)
- #pragma once 与 #define的含义及用法
- mysql ibdata1 作用_Mysql优化ibdata1大小
- 【Docker Desktop】Docker Desktop的安装与使用:
- Shader实例(流光实现)
- miui9如何不自动杀进程_小米MIUI 9官方没有告诉你的十大隐藏功能!
- Java虚拟机中类加载机制详解
- Buuctf Crpyto writeup --[GKCTF2020]小学生的密码学