python生成隨機(jī)紅包的實(shí)例寫法
假設(shè)紅包金額為money,數(shù)量是num,并且紅包金額money>=num*0.01
原理如下,從1~money*100的數(shù)的集合中,隨機(jī)抽取num-1個(gè)數(shù),然后對(duì)這些數(shù)進(jìn)行排序,在排序后的集合前后分別插入0和money*100,組成新的集合
用新的集合,(后一個(gè)數(shù)-前一個(gè)數(shù))/100得到紅包的大小
然后使用紅包的時(shí)候,從num個(gè)紅包集合中隨機(jī)拿一個(gè),既是隨機(jī)紅包了
def redbags(money, num=10): import random choice = random.sample(range(1, money * 100), num - 1) choice.extend([0,money*100]) choice.sort() return [(choice[i + 1] - choice[i]) / 100 for i in range(num)]
擴(kuò)展內(nèi)容:
進(jìn)入紅包思路主題
好了前面簡(jiǎn)單的介紹玩今天要使用的工具該進(jìn)入正題說說紅包的思路了,在你發(fā)紅包的時(shí)候要填寫兩個(gè)重要參數(shù)就是紅包的金額我命名為cash,人數(shù)person,在就要思考重要的一點(diǎn)就是紅包的最大值和最小值,不會(huì)有點(diǎn)紅包領(lǐng)到0吧,一般0.01為最小值,為什么會(huì)來說還有最大值,你想假如一個(gè)10塊的紅包6個(gè)人搶第一個(gè)能搶了9.99,那么第二個(gè)人只有剩下0.01,后面的人沒得強(qiáng),這不就有問題了。所以最大值應(yīng)該就是紅包總金額減去最小值乘以人數(shù)(10-0.01x6)這樣才保證大家都有得搶當(dāng)然最貪婪的寫法是10-0.01x5有人會(huì)問為什么是5,已經(jīng)把第一個(gè)人排除剩下五個(gè)最慘的結(jié)局都是0.01?;灸阏莆者@個(gè)思路就好寫代碼了看看如下:
#!/usr/bin/env python # -*-coding:utf-8 -*- import random dic={} lis = ['KeLan','Monkey','Dexter','Superman','Iron Man','Robin'] def redpacket(cash,person,index): if cash>0 and person !=1: n = round(random.uniform(0.01,cash-(0.01*person)),2) dic[lis[index]] = n print str(n).ljust(4,"0") person-=1 cash-=n index+=1 redpacket(cash,person,index) else: dic[lis[index]]=round(cash,2) print str(cash).ljust(4,"0") redpacket(10,len(lis),0) print dic print "手氣最佳:",max(dic.items(),key=lambda x:x[1])
我在這里用的是遞減的方式來遞歸剩余的錢數(shù)與人數(shù),加了個(gè)判斷防止無限遞歸。只要錢cash大于0并且person剩余人數(shù)不是1那么繼續(xù)往下走:n是隨機(jī)浮點(diǎn)數(shù),范圍是從最小的0.01到當(dāng)前的金額,round是取小數(shù)點(diǎn)后保留2位,這字典用來存放相應(yīng)的人搶了多少紅包金額,然后人數(shù)自減少1,金額自減當(dāng)前搶走的金額index是從人名中順序取值(當(dāng)然實(shí)際不會(huì)按找順序搶,這里只是掩飾介紹過程),然后遞歸調(diào)用自己把剩余的錢cash,剩余人數(shù)person,新位置的人重新傳參,如果剩下最后一個(gè)人(測(cè)試了50次,沒有發(fā)現(xiàn)金額小于0的情況所以這里只表述人)那么剩下的錢就都是他的并且添加到字典,打印輸出,由于else內(nèi)沒調(diào)用自身遞歸自然結(jié)束最后打印字典的包含了人與搶紅包金額對(duì)應(yīng),最后要答應(yīng)手氣最佳的人用max從列表中取最大值dic.items()返回以元組形式一一對(duì)應(yīng)的列表[(person人,cash錢)],lambda寫的是取每個(gè)元素的的1位置來做比較也是就是cash值來做比較,max拿出列表中最大的元組。
以上就是本次介紹的全部知識(shí)點(diǎn)內(nèi)容,感謝大家對(duì)腳本之家的支持。
- 基于python實(shí)現(xiàn)微信收紅包自動(dòng)化測(cè)試腳本(測(cè)試用例)
- Python+Appium實(shí)現(xiàn)自動(dòng)搶微信紅包
- 用60行代碼實(shí)現(xiàn)Python自動(dòng)搶微信紅包
- Python實(shí)現(xiàn)的微信紅包提醒功能示例
- Python自動(dòng)搶紅包教程詳解
- python 實(shí)現(xiàn)紅包隨機(jī)生成算法的簡(jiǎn)單實(shí)例
- python實(shí)現(xiàn)紅包裂變算法
- Python版微信紅包分配算法
- Java 入門圖形用戶界面設(shè)計(jì)之列表框JList
相關(guān)文章
tensorflow之讀取jpg圖像長(zhǎng)和寬實(shí)例
這篇文章主要介紹了tensorflow之讀取jpg圖像長(zhǎng)和寬實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06如何通過python實(shí)現(xiàn)IOU計(jì)算代碼實(shí)例
這篇文章主要介紹了如何通過python實(shí)現(xiàn)IOU計(jì)算代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11使用Python操作Excel中圖片的基礎(chǔ)示例(插入、替換、提取、刪除)
Excel是主要用于處理表格和數(shù)據(jù)的工具,我們也能在其中插入、編輯或管理圖片,為工作表增添視覺效果,提升報(bào)告的吸引力,本文將詳細(xì)介紹如何使用Python操作Excel中的圖片,文中有詳細(xì)代碼示例供大家參考,需要的朋友可以參考下2024-07-07python GUI庫(kù)圖形界面開發(fā)之PyQt5多線程中信號(hào)與槽的詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開發(fā)之PyQt5多線程中信號(hào)與槽的詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03簡(jiǎn)單實(shí)例帶你了解Python的編譯和執(zhí)行全過程
python 是一種解釋型的編程語言,所以不像編譯型語言那樣需要顯式的編譯過程。然而,在 Python 代碼執(zhí)行之前,它需要被解釋器轉(zhuǎn)換成字節(jié)碼,這個(gè)過程就是 Python 的編譯過程,還不知道的朋友快來看看吧2023-04-04python array中關(guān)于[a,b,c]的使用方式
這篇文章主要介紹了python array中關(guān)于[a,b,c]的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02