国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現紅包裂變算法

2019-11-25 16:56:14
字體:
來源:轉載
供稿:網友

本文實例介紹了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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 夹江县| 东辽县| 淮滨县| 夏邑县| 阜新市| 东乌珠穆沁旗| 宁晋县| 五莲县| 贵南县| 宝山区| 志丹县| 泌阳县| 滨州市| 遂川县| 长寿区| 乐清市| 剑阁县| 寻甸| 依安县| 陆川县| 固镇县| 崇仁县| 阆中市| 瑞金市| 怀来县| 韩城市| 佛学| 邓州市| 自贡市| 海伦市| 通化市| 凌云县| 鹰潭市| 德阳市| 灵璧县| 沁源县| 海阳市| 泽库县| 军事| 旺苍县| 文昌市|