日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

抢红包算法之线段切割法的python简单实现

發布時間:2024/3/13 python 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 抢红包算法之线段切割法的python简单实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

搶紅包算法詳解來源于【程序員小灰】的文章:https://mp.weixin.qq.com/s/AIE33sdT2QI6UL8cs1kJCQ

以下為python簡單實現:

import random from decimal import Decimaldef qhb(money: float, num: int) -> list:"""搶紅包算法 - 線段切割法。傳入參數:紅包金額(單位:元)money、紅包個數num"""if num <= 0:return None# 由單位元轉為分,減少浮點數帶來的影響v_money = int(money * 100)# 只有一個紅包,直接返回紅包總額if num == 1:return [v_money]# 從【1,v_money-1】取隨機整數作為線段切割點。若該整數不在列表當中,插入該整數,直到獲取夠num-1的切割點hb_split_list = []while len(hb_split_list) < num - 1:single_hb = random.randint(1, v_money - 1)if single_hb not in hb_split_list:hb_split_list.append(single_hb)# 對切割點升序排序,遍歷列表時用當前切割點的值減上一個切割點的值# 第一個切割點與0相減# 這樣得到num-1個紅包金額hb_split_list.sort()hb_list = []last_value = 0for split_line_value in hb_split_list:# 這個時候要把【分】換算回【元】,借助Decimal保證精度準確性hb_list.append(Decimal(split_line_value - last_value) / 100)last_value = split_line_value# 第num個紅包通過v_money與最后一個切割點相減得到,這個時候也要把【分】換算回【元】hb_list.append(Decimal(v_money - last_value) / 100)return hb_listif __name__ == "__main__":v = qhb(1000.10, 100)print(v)# 驗算v_sum = Decimal("0")for vv in v:v_sum = v_sum + vvprint(v_sum)

總結

以上是生活随笔為你收集整理的抢红包算法之线段切割法的python简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。