抢红包算法之线段切割法的python简单实现
生活随笔
收集整理的這篇文章主要介紹了
抢红包算法之线段切割法的python简单实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
搶紅包算法詳解來源于【程序員小灰】的文章:https://mp.weixin.qq.com/s/AIE33sdT2QI6UL8cs1kJCQ
以下為python簡單實(shí)現(xiàn):
import random from decimal import Decimaldef qhb(money: float, num: int) -> list:"""搶紅包算法 - 線段切割法。傳入?yún)?shù):紅包金額(單位:元)money、紅包個(gè)數(shù)num"""if num <= 0:return None# 由單位元轉(zhuǎn)為分,減少浮點(diǎn)數(shù)帶來的影響v_money = int(money * 100)# 只有一個(gè)紅包,直接返回紅包總額if num == 1:return [v_money]# 從【1,v_money-1】取隨機(jī)整數(shù)作為線段切割點(diǎn)。若該整數(shù)不在列表當(dāng)中,插入該整數(shù),直到獲取夠num-1的切割點(diǎn)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)# 對(duì)切割點(diǎn)升序排序,遍歷列表時(shí)用當(dāng)前切割點(diǎn)的值減上一個(gè)切割點(diǎn)的值# 第一個(gè)切割點(diǎn)與0相減# 這樣得到num-1個(gè)紅包金額hb_split_list.sort()hb_list = []last_value = 0for split_line_value in hb_split_list:# 這個(gè)時(shí)候要把【分】換算回【元】,借助Decimal保證精度準(zhǔn)確性hb_list.append(Decimal(split_line_value - last_value) / 100)last_value = split_line_value# 第num個(gè)紅包通過v_money與最后一個(gè)切割點(diǎn)相減得到,這個(gè)時(shí)候也要把【分】換算回【元】hb_list.append(Decimal(v_money - last_value) / 100)return hb_listif __name__ == "__main__":v = qhb(1000.10, 100)print(v)# 驗(yàn)算v_sum = Decimal("0")for vv in v:v_sum = v_sum + vvprint(v_sum)總結(jié)
以上是生活随笔為你收集整理的抢红包算法之线段切割法的python简单实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 设置边距总结
- 下一篇: 原来ChatGPT可以充当这么多角色