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)遞歸剩余的錢數(shù)與人數(shù),加了個(gè)判斷防止無(wú)限遞歸。只要錢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ì)按找順序搶,這里只是掩飾介紹過(guò)程),然后遞歸調(diào)用自己把剩余的錢cash,剩余人數(shù)person,新位置的人重新傳參,如果剩下最后一個(gè)人(測(cè)試了50次,沒(méi)有發(fā)現(xiàn)金額小于0的情況所以這里只表述人)那么剩下的錢就都是他的并且添加到字典,打印輸出,由于else內(nèi)沒(méi)調(diào)用自身遞歸自然結(jié)束最后打印字典的包含了人與搶紅包金額對(duì)應(yīng),最后要答應(yīng)手氣最佳的人用max從列表中取最大值dic.items()返回以元組形式一一對(duì)應(yīng)的列表[(person人,cash錢)],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 入門圖形用戶界面設(shè)計(jì)之列表框JList
相關(guān)文章
Python爬蟲(chóng)實(shí)現(xiàn)爬取京東手機(jī)頁(yè)面的圖片(實(shí)例代碼)
下面小編就為大家分享一篇Python爬蟲(chóng)實(shí)現(xiàn)爬取京東手機(jī)頁(yè)面的圖片實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
利用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易的截圖工具
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易的截圖工具,可以截完圖之后顯示并且永遠(yuǎn)前置,感興趣的小伙伴可以嘗試一下2022-07-07
pytorch教程網(wǎng)絡(luò)和損失函數(shù)的可視化代碼示例
這篇文章主要介紹了pytorch教程中網(wǎng)絡(luò)和損失函數(shù)的可視化,文中附含詳細(xì)的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
Django數(shù)據(jù)庫(kù)遷移常見(jiàn)使用方法
這篇文章主要介紹了Django數(shù)據(jù)庫(kù)遷移常見(jiàn)使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Python PyQt5 Pycharm 環(huán)境搭建及配置詳解(圖文教程)
這篇文章主要介紹了Python PyQt5 Pycharm 環(huán)境搭建及配置詳解,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python實(shí)現(xiàn)簡(jiǎn)單的俄羅斯方塊游戲
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單的俄羅斯方塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

