#紅包生成思路#200 塊錢 10個紅包
#0-200 的乙個軸,隨機取9個點,分成10段, 每一段的值表示乙個紅包的大小
#把輸入的 money值 * 100 拿到的數值就是分, 不用再考慮單位是元的時候 保留2位小數
import
random
defred_pocket(money,num):
money = money * 100 #把元 換算成分
ret = random.sample(range(1,money),num-1)
#random.sample 要在列表中取值,所以要range一下,range(1,money)1是1分,再隨機抽取9個數
ret.sort()
#***沒有返回值***
#對抽取的數進行排列 [3016, 8109, 12859, 13762, 14179, 14329, 15012, 17230, 19200]
#在列表中插入 0 和200, 等會做減法算每乙個紅包的大小用
ret.insert(0,0)
#return ret [0, 2146, 2299, 2303, 5749, 8003, 8968, 14713, 17829, 19375, 20000]
for i in range(len(ret)-1):
gap = (ret[i+1] - ret[i])/100 #
算出每一段的差值,再除以100 轉換成單位元
yield gap #
分回乙個生成器, 在抽紅包之前就已經分好了,然後按照抽的順序彈出紅包金額
red_g = red_pocket(200,10)
for i in
red_g:
print(i)
#對生成器迴圈10次,檢視金額的分配情況
for j in range(10):
red_g = red_pocket(200,10)
lst =
for i in
red_g:
(lst)
#結果:
[8.8, 8.83, 55.25, 34.3, 7.5, 18.83, 25.88, 5.05, 5.44, 30.12]
[25.83, 26.8, 15.77, 50.31, 1.86, 30.71, 2.73, 14.76, 29.07, 2.16]
[2.22, 62.77, 2.76, 7.02, 2.7, 34.73, 7.72, 16.13, 21.74, 42.21]
[20.62, 2.85, 13.56, 19.2, 35.54, 13.35, 15.78, 10.49, 67.04, 1.57]
[23.94, 27.86, 6.54, 69.68, 0.64, 5.5, 2.87, 14.26, 44.74, 3.97]
[21.69, 8.92, 22.33, 8.22, 13.65, 38.69, 15.82, 3.33, 9.88, 57.47]
[32.61, 8.4, 0.14, 5.47, 4.09, 48.72, 30.4, 13.32, 12.6, 44.25]
[2.56, 31.74, 38.63, 4.93, 45.22, 10.95, 7.8, 15.75, 13.96, 28.46]
[11.31, 10.21, 1.09, 7.8, 30.58, 43.52, 29.68, 55.75, 7.05, 3.01]
[19.96, 53.82, 8.67, 18.44, 6.52, 11.43, 38.6, 1.93, 20.37, 20.26]
可以對比一下不同的思路:
#方法二:
#發紅包
#紅包數量 錢數
#拼手氣紅包
import
random
deffunc(x,y):
count = 1lst =
while count <=num:
for i in
range(num):
global
money
bonus = random.uniform(0.01,money-(0.01*num)) #
取隨機小時, 範圍是0.01 - money
bonus = round(bonus,2) #
取小數點後保留兩位
money = money -bonus
random.shuffle(lst)
#對生成的結果重新洗牌
#但是缺點還是存在, 這種演算法的缺點是因為一開始會有人先抽取乙個大數,剩餘的人在剩下的小範圍內抽數
#很少再有人抽到的數比第乙個人的大. 雖然shuffle 把抽取結果重新洗牌了,但是還會看到數字分布有極端
return
lstnum = 5 #
int(input("紅包個數:"))
money = 20 #
int(input("金額:"))
print(func(num,money))
for i in range(10):num = 5 #
int(input("紅包個數:"))
money = 20 #
int(input("金額:"))
(func(num,money))
結果: 可以發現有乙個兩個比較大的數,剩餘的都很小
[1.11, 0.14, 6.44, 0.19, 11.55]
[6.29, 0.04, 10.68, 0.76, 1.21]
[2.58, 0.02, 14.79, 1.01, 1.24]
[0.01, 9.85, 0.04, 9.04, 0.96]
[0.02, 2.13, 0.83, 13.3, 3.64]
[0.32, 0.25, 5.12, 3.04, 11.19]
[18.83, 0.36, 0.07, 0.05, 0.62]
[0.07, 17.4, 2.29, 0.16, 0.02]
[10.23, 1.37, 0.98, 2.31, 4.4]
[2.59, 0.12, 1.75, 0.65, 13.51]
python 生成器作用 Python生成器
生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...
python生成器好處 Python生成器筆記
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...