python寫紅包的原理流程包含random,lambda其中的使用和見簡單介紹


Python寫紅包的原理流程


首先來說說要用到的知識點,第一個要說的是擴展包random,random模塊一般用來生成一個隨機數

今天要用到ramdom中unifrom的方法用於生成一個指定范圍的隨機浮點數通過下面的圖簡單看下:

這里就打印了一個值范圍是在10~20之間的浮點數。


 

在來說說lambda表達式是匿名函數,是函數的另一種表達方式,以下清晰了介紹了使用效果:

t函數有3個值,返回3個數之和,f是lambda表達式,作用同樣是返回三個數只和,def 類似 lambda,t類似f, (x,y,z):類似x,y,z:, return x+y+z類似:x+y+z  最后都調用函數返回其和不過在此提醒函數可以寫很復雜,lambda寫復雜了就不容易理解,代碼畢竟簡單易懂為先。


 

進入紅包思路主題

好了前面簡單的介紹玩今天要使用的工具該進入正題說說紅包的思路了,在你發紅包的時候要填寫兩個重要參數就是紅包的金額我命名為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,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])

我在這里用的是遞減的方式來遞歸剩余的錢數與人數,加了個判斷防止無限遞歸。只要錢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拿出列表中最大的元組。

來看看最后打印效果如下

是不是簡單清晰,最后大家可以多試試效果,我在此只是把自己的思路與大家分享了一下,當然大家有好的建議修改或者更優化的方式在后面留言,互相學習。感謝大家的觀看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM