python生成隨機(jī)紅包的實(shí)例寫(xiě)法
假設(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)入正題說(shuō)說(shuō)紅包的思路了,在你發(fā)紅包的時(shí)候要填寫(xiě)兩個(gè)重要參數(shù)就是紅包的金額我命名為cash,人數(shù)person,在就要思考重要的一點(diǎn)就是紅包的最大值和最小值,不會(huì)有點(diǎn)紅包領(lǐng)到0吧,一般0.01為最小值,為什么會(huì)來(lái)說(shuō)還有最大值,你想假如一個(gè)10塊的紅包6個(gè)人搶第一個(gè)能搶了9.99,那么第二個(gè)人只有剩下0.01,后面的人沒(méi)得強(qiáng),這不就有問(wèn)題了。所以最大值應(yīng)該就是紅包總金額減去最小值乘以人數(shù)(10-0.01x6)這樣才保證大家都有得搶當(dāng)然最貪婪的寫(xiě)法是10-0.01x5有人會(huì)問(wèn)為什么是5,已經(jīng)把第一個(gè)人排除剩下五個(gè)最慘的結(jié)局都是0.01?;灸阏莆者@個(gè)思路就好寫(xiě)代碼了看看如下:
#!/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])
我在這里用的是遞減的方式來(lái)遞歸剩余的錢(qián)數(shù)與人數(shù),加了個(gè)判斷防止無(wú)限遞歸。只要錢(qián)cash大于0并且person剩余人數(shù)不是1那么繼續(xù)往下走:n是隨機(jī)浮點(diǎn)數(shù),范圍是從最小的0.01到當(dāng)前的金額,round是取小數(shù)點(diǎn)后保留2位,這字典用來(lái)存放相應(yīng)的人搶了多少紅包金額,然后人數(shù)自減少1,金額自減當(dāng)前搶走的金額index是從人名中順序取值(當(dāng)然實(shí)際不會(huì)按找順序搶?zhuān)@里只是掩飾介紹過(guò)程),然后遞歸調(diào)用自己把剩余的錢(qián)cash,剩余人數(shù)person,新位置的人重新傳參,如果剩下最后一個(gè)人(測(cè)試了50次,沒(méi)有發(fā)現(xiàn)金額小于0的情況所以這里只表述人)那么剩下的錢(qián)就都是他的并且添加到字典,打印輸出,由于else內(nèi)沒(méi)調(diào)用自身遞歸自然結(jié)束最后打印字典的包含了人與搶紅包金額對(duì)應(yīng),最后要答應(yīng)手氣最佳的人用max從列表中取最大值dic.items()返回以元組形式一一對(duì)應(yīng)的列表[(person人,cash錢(qián))],lambda寫(xiě)的是取每個(gè)元素的的1位置來(lái)做比較也是就是cash值來(lái)做比較,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 入門(mén)圖形用戶界面設(shè)計(jì)之列表框JList
相關(guān)文章
tensorflow之讀取jpg圖像長(zhǎng)和寬實(shí)例
這篇文章主要介紹了tensorflow之讀取jpg圖像長(zhǎng)和寬實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06如何通過(guò)python實(shí)現(xiàn)IOU計(jì)算代碼實(shí)例
這篇文章主要介紹了如何通過(guò)python實(shí)現(xiàn)IOU計(jì)算代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11python如何通過(guò)openpyxl讀寫(xiě)Excel文件
python操作excel的庫(kù)有很多,有的庫(kù)只能讀取xsl格式,比如xlrd庫(kù),有的庫(kù)只能寫(xiě)xsl格式,比如xlwt庫(kù),有的只能讀寫(xiě)xslx格式,比如openpyxl庫(kù),綜合各庫(kù)及 xslx 格式比較常見(jiàn),所以本文主要講解openpyxl庫(kù)對(duì)xslx格式的excel操作,需要的朋友可以參考下2023-10-10使用Python操作Excel中圖片的基礎(chǔ)示例(插入、替換、提取、刪除)
Excel是主要用于處理表格和數(shù)據(jù)的工具,我們也能在其中插入、編輯或管理圖片,為工作表增添視覺(jué)效果,提升報(bào)告的吸引力,本文將詳細(xì)介紹如何使用Python操作Excel中的圖片,文中有詳細(xì)代碼示例供大家參考,需要的朋友可以參考下2024-07-07python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5多線程中信號(hào)與槽的詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5多線程中信號(hào)與槽的詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03簡(jiǎn)單實(shí)例帶你了解Python的編譯和執(zhí)行全過(guò)程
python 是一種解釋型的編程語(yǔ)言,所以不像編譯型語(yǔ)言那樣需要顯式的編譯過(guò)程。然而,在 Python 代碼執(zhí)行之前,它需要被解釋器轉(zhuǎn)換成字節(jié)碼,這個(gè)過(guò)程就是 Python 的編譯過(guò)程,還不知道的朋友快來(lái)看看吧2023-04-04python array中關(guān)于[a,b,c]的使用方式
這篇文章主要介紹了python array中關(guān)于[a,b,c]的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02