1. 程式人生 > 其它 >python從入門到入魔第七天——random庫的使用(簡單模擬鬥地主發牌演算法)

python從入門到入魔第七天——random庫的使用(簡單模擬鬥地主發牌演算法)

技術標籤:筆記

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.生成106為密碼則需要迴圈
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 ♣66788 ♣A ♠103 ♠A ♥8344 ♥Q ♠K 
玩家2:
小王 ♦J ♠5 ♣Q ♦63 大王 ♦104267 ♠Q ♥5 ♥K ♥J ♠2 
玩家3:
♠9 ♣J ♥952 ♠J ♦910104 ♦A ♦Q ♠3 ♣K ♣852 
底牌:
♣797 

誰是地主??底牌給誰??
思路:試試random庫中的choice()函式,列印輸出時給出判斷(if-else的簡潔用法參考篇python從入門都入魔第六天——分支結構與迴圈結構),哪個玩家的條件成立就把底牌給誰,不會的私信我!!

下一篇分享海龜畫圖的庫!!