抢红包算法之线段切割法的python简单实现
生活随笔
收集整理的這篇文章主要介紹了
抢红包算法之线段切割法的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简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 设置边距总结
- 下一篇: wxpython 按钮 扁平化_jque