python生成隨機紅包的例項寫法
假設紅包金額為money,數量是num,並且紅包金額money>=num*0.01
原理如下,從1~money*100的數的集合中,隨機抽取num-1個數,然後對這些數進行排序,在排序後的集合前後分別插入0和money*100,組成新的集合
用新的集合,(後一個數-前一個數)/100得到紅包的大小
然後使用紅包的時候,從num個紅包集合中隨機拿一個,既是隨機紅包了
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)]
擴充套件內容:
進入紅包思路主題
好了前面簡單的介紹玩今天要使用的工具該進入正題說說紅包的思路了,在你發紅包的時候要填寫兩個重要引數就是紅包的金額我命名為cash,人數person,在就要思考重要的一點就是紅包的最大值和最小值,不會有點紅包領到0吧,一般0.01為最小值,為什麼會來說還有最大值,你想假如一個10塊的紅包6個人搶第一個能搶了9.99,那麼第二個人只有剩下0.01,後面的人沒得強,這不就有問題了。所以最大值應該就是紅包總金額減去最小值乘以人數(10-0.01x6)這樣才保證大家都有得搶當然最貪婪的寫法是10-0.01x5有人會問為什麼是5,已經把第一個人排除剩下五個最慘的結局都是0.01。基本你掌握這個思路就好寫程式碼了看看如下:
#!/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,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])
我在這裡用的是遞減的方式來遞迴剩餘的錢數與人數,加了個判斷防止無限遞迴。只要錢cash大於0並且person剩餘人數不是1那麼繼續往下走:n是隨機浮點數,範圍是從最小的0.01到當前的金額,round是取小數點後保留2位,這字典用來存放相應的人搶了多少紅包金額,然後人數自減少1,金額自減當前搶走的金額index是從人名中順序取值(當然實際不會按找順序搶,這裡只是掩飾介紹過程),然後遞迴呼叫自己把剩餘的錢cash,剩餘人數person,新位置的人重新傳參,如果剩下最後一個人(測試了50次,沒有發現金額小於0的情況所以這裡只表述人)那麼剩下的錢就都是他的並且新增到字典,列印輸出,由於else內沒呼叫自身遞迴自然結束最後列印字典的包含了人與搶紅包金額對應,最後要答應手氣最佳的人用max從列表中取最大值dic.items()返回以元組形式一一對應的列表[(person人,cash錢)],lambda寫的是取每個元素的的1位置來做比較也是就是cash值來做比較,max拿出列表中最大的元組。
以上就是本次介紹的全部知識點內容,感謝大家對我們的支援。