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从入门都入魔第六天——分支结构与循环结构),哪个玩家的条件成立就把底牌给谁,不会的私信我!!

下一篇分享海龟画图的库!!

你可能感兴趣的