python實(shí)現(xiàn)紅包裂變算法
本文實(shí)例介紹了python實(shí)現(xiàn)紅包裂變算法,分享給大家供大家參考,具體內(nèi)容如下
Python語言庫函數(shù)
安裝:pip install redpackets
使用:
import redpackets redpackets.split(total, num, min=0.01)
1、前情提要
過年期間支付寶紅包、微信紅包成了全民焦點(diǎn),雖然大多數(shù)的紅包就一塊八角的樣子,還是搞得大家樂此不疲。作為一名程序猿,自然會(huì)想了解下紅包的實(shí)現(xiàn)細(xì)節(jié),微信目前是沒有公布紅包的實(shí)現(xiàn)細(xì)節(jié)的,所以這里就綜合網(wǎng)上的討論通過 Python 來實(shí)現(xiàn)紅包裂變。
2、紅包規(guī)則
紅包領(lǐng)了不少,據(jù)觀察紅包主要有以下幾個(gè)限制條件:
所有人都能分到紅包,也就是不會(huì)出現(xiàn)紅包數(shù)值為 0 的情況
所有人的紅包數(shù)值加起來等于支付的金額
紅包波動(dòng)范圍比較大,約 5%~8% 的紅包數(shù)值在平均值的兩倍以上,同時(shí)數(shù)額 0.01 出現(xiàn)的概率比較高
紅包的數(shù)值是隨機(jī)的,并且數(shù)值的分布近似于正態(tài)分布
其中,前兩條是最基本的限制條件,如果要求不是特別高,可以完全只考慮前兩個(gè)限制條件即可。
3、裂變方式一
3.1、簡(jiǎn)單實(shí)現(xiàn)
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、相關(guān)問題
如使用該方式,需要自己去添加相關(guān)代碼邏輯去處理如下問題
浮點(diǎn)數(shù)精度問題
邊界值的處理
4、裂變方式二
4.1、完整實(shí)現(xiàn)
# -*- 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 個(gè)紅包,支持 8 人隨機(jī)領(lǐng)取
:param min=0.01; # 每個(gè)人最少能收到 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) # 隨機(jī)安全上限
money = money_val(min * 100, int(safe_total * 100)) / 100
total -= money
money_list.append(money)
money_list.append(total)
random.shuffle(money_list) # 隨機(jī)打亂
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、函數(shù)使用
4.2.1、使用 money_random 預(yù)先將紅包裂變,存放在 memcache 或者 redis 中
- total —— 紅包總額
- num —— 裂變個(gè)數(shù)
- min —— 非必須,紅包最小面額,默認(rèn) 0.01
4.2.2、當(dāng)用戶搶紅包的時(shí)候,直接 pop 出來一個(gè),直到將所有紅包 pop 完
4.3、庫使用說明
因?yàn)樯婕暗礁↑c(diǎn)運(yùn)算,所以使用了 Decimal
5、源碼示例
5.1、運(yùn)行
python algorithm_utils.py
5.2、效果
5.2.1、對(duì)于如下幾個(gè)示例
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、裂變后的紅包列表如下

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)python程序設(shè)計(jì)有所幫助。
- 基于python實(shí)現(xiàn)微信收紅包自動(dòng)化測(cè)試腳本(測(cè)試用例)
- Python+Appium實(shí)現(xiàn)自動(dòng)搶微信紅包
- 用60行代碼實(shí)現(xiàn)Python自動(dòng)搶微信紅包
- python生成隨機(jī)紅包的實(shí)例寫法
- Python實(shí)現(xiàn)的微信紅包提醒功能示例
- Python自動(dòng)搶紅包教程詳解
- python 實(shí)現(xiàn)紅包隨機(jī)生成算法的簡(jiǎn)單實(shí)例
- Python版微信紅包分配算法
- Java 入門圖形用戶界面設(shè)計(jì)之列表框JList
相關(guān)文章
Pycharm在創(chuàng)建py文件時(shí),自動(dòng)添加文件頭注釋的實(shí)例
今天小編就為大家分享一篇Pycharm在創(chuàng)建py文件時(shí),自動(dòng)添加文件頭注釋的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
在Python中執(zhí)行系統(tǒng)命令的方法示例詳解
最近在做那個(gè)測(cè)試框架的時(shí)候發(fā)現(xiàn)對(duì)python執(zhí)行系統(tǒng)命令不太熟悉,所以想著總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于在Python中執(zhí)行系統(tǒng)命令的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09
教你如何在pycharm中安裝opencv,tensorflow,keras
今天通過本教程教大家如何在pycharm中安裝opencv,tensorflow,keras,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
使用python如何實(shí)現(xiàn)泛型函數(shù)
這篇文章主要介紹了使用python如何實(shí)現(xiàn)泛型函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
PyTorch實(shí)現(xiàn)重寫/改寫Dataset并載入Dataloader
這篇文章主要介紹了PyTorch實(shí)現(xiàn)重寫/改寫Dataset并載入Dataloader,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Python使用自帶的base64庫進(jìn)行base64編碼和解碼
在Python中,處理數(shù)據(jù)的編碼和解碼是數(shù)據(jù)傳輸和存儲(chǔ)中非常普遍的需求,其中,Base64是一種常用的編碼方案,本文我將詳細(xì)介紹如何使用Python的base64庫進(jìn)行Base64編碼和解碼,需要的朋友可以參考下2025-04-04
python安裝cxOracle避坑總結(jié)不要直接pip install
這篇文章主要為大家介紹了python安裝cx_Oracle是遇到的一些問題的解決辦法的總結(jié),來幫大家避避坑有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步2021-10-10

