python從入門到入魔第七天——random庫的使用(簡單模擬鬥地主發牌演算法)
阿新 • • 發佈:2021-01-15
技術標籤:筆記
random庫的介紹
random 庫是進行隨機運算的標準庫,所謂標準庫就是python語言內建的函式庫不需要第三方安裝。使用random庫的目的是生成隨機數,才用的是梅森旋轉演算法生成偽隨機數列
random庫的使用
常用函式:
seed(a=None) 初始化隨機數種子,預設值為當前系統時間
random() 隨機生成一個[0.0,1.0)之間的小數
randint(a,b) 隨機生成一個[a,b]之間的整數
randrange(start,stop,step)隨機生成一個範圍在[start,stop),以step為步長的整數
getrandbits(k) 隨機生成一個k位元長度的整數
uniform( a,b) 隨機生成一個[a,b]之間的小數
choice(seq) 從序列型別中隨機返回一個元素
shuffle(seq) 將序列型別的元素隨機排序,返回一個隨機排序的列表
sample(pop,k) 從pop型別中隨機選取k個元素,以列表形式返回
>>> import random
>>> random.random()
0.8407924895042552
>>> random.randint(1,10)
10
>>> random.randrange(1,10,5)
1
>>> random.randrange( 1,10,5)
6
>>> random.getrandbits(5)
24
>>> random.uniform(1,10)
6.844525081612232
>>> list = [1,2,3,4,5,6]
>>> random.choice(list)
4
>>> random.shuffle(list)
>>> list
[4, 6, 3, 5, 2, 1]
>>> random.sample(list,2)
[1, 3]
>>> list
[4, 6, 3, 5, 2, 1]
>>>
隨機數種子相同生成的隨機數也是相同的
>>> random.seed(10) #隨機數種子一般為整數
>>> random.random()
0.5714025946899135
>>> random.random() #未定義隨機數種子生成隨機數
0.4288890546751146
>>> random.seed(10) #再次定義隨機種子為10生成的隨機數
>>> random.random()
0.5714025946899135
可以看出第一個隨機數和最後一個隨機數完全相同
利用random隨機數的庫做一個密碼生成器
#隨機密碼生成。編寫程式在26個字母大小寫和9個數字組成的列表中隨機生成5個6位數密碼
思路:
1.先寫列表
2.隨機生成則需要考慮random庫
3.生成10個6為密碼則需要迴圈
import random
s = "123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
ls = list(s)
for i in range(5): #迴圈控制生成的個數
secert = ""
for j in range(6): #控制密碼的位數
secert += random.choice(ls)
print(secert)
輸出結果:
NNUrLZ
pK4ZvE
poI6Dd
nuyTtF
hpJJin
進階玩法:
import random
for i in range(5):
for j in range(6):
a=chr(random.randint(48,57)) #0-9的Unicode十進位制編碼範圍
b=chr(random.randint(97,122)) #a-z的Unicode十進位制編碼範圍
c=chr(random.randint(65,90)) #A-Z的Unicode十進位制編碼範圍
if j < 5: #不換行列印前五位的密碼
print(random.choice([a, b, c]), end='')
else: #列印第六位密碼並換行輸出
print(random.choice([a, b, c]))
輸出結果:
98AP55
QiWJ10
zA3Ny2
0hUHvm
WDP1E1
模擬鬥地主洗髮牌——3人54張牌,逐個發牌玩法
思路:
1.先準備54張牌並放到一個序列型別中
2.再進行洗牌,由於隨機洗牌則可以使用shuffle函式
3.然後發牌則可以用上述的循換每個玩家生成17張牌
import random
poke = [] #撲克牌堆
play1 = [] #玩家1牌堆
play2 = [] #玩家2牌堆
play3 = [] #玩家3牌堆
last = [] #底牌牌堆
flowers = ("♥","♠","♣","♦") #花色元組
nums = ("2","3","4","5","6","7","8","9","10","J","Q","K","A") # 點數元組
king = {"big":"大王","small":"小王"} # 大小王
for flower in flowers: #遍歷花色
for num in nums: #遍歷點數
poke.append("%s%s"%(flower,num)) #將花色和點數的結合體存到poke牌堆列表中,為了好看將元組格式化了一下
poke.append(king["big"]) #將大王存入poke牌堆列表中
poke.append(king["small"]) ##將小王存入poke牌堆列表中
random.shuffle(poke) #洗牌
#一個接著一個發牌
for i in range(17): #每人17張牌迴圈17次
play1.append(poke.pop(0)) #從隨機排序的poke列表中取出第一個元素,拋給play1玩家列表
play2.append(poke.pop(0)) #list.pop(i)函式是從list列表中取出序號為i的值
play3.append(poke.pop(0)) #這樣3條語句就實現了一個一個的發牌
last = poke #將剩下的3張牌拋給底牌
#列印每個玩家的牌
print("玩家1:")
for poke1 in play1: #也可以直接列印play1列表,但返回的是一個列表格式,不是很好看
print(poke1,end=" ")
print("\n玩家2:") #“\n”作用是換行,為了輸出格式漂亮
for poke2 in play2:
print(poke2,end=" ")
print("\n玩家3:")
for poke3 in play3:
print(poke3,end=" ")
print("\n底牌:")
for last in last:
print(last,end=" ")
輸出結果:
玩家1:
♦K ♥A ♣6 ♠6 ♥7 ♠8 ♦8 ♣A ♠10 ♣3 ♠A ♥8 ♥3 ♠4 ♦4 ♥Q ♠K
玩家2:
小王 ♦J ♠5 ♣Q ♦6 ♦3 大王 ♦10 ♥4 ♣2 ♥6 ♠7 ♠Q ♥5 ♥K ♥J ♠2
玩家3:
♠9 ♣J ♥9 ♣5 ♦2 ♠J ♦9 ♥10 ♣10 ♣4 ♦A ♦Q ♠3 ♣K ♣8 ♦5 ♥2
底牌:
♣7 ♣9 ♦7
誰是地主??底牌給誰??
思路:試試random庫中的choice()函式,列印輸出時給出判斷(if-else的簡潔用法參考篇python從入門都入魔第六天——分支結構與迴圈結構),哪個玩家的條件成立就把底牌給誰,不會的私信我!!
下一篇分享海龜畫圖的庫!!