python从入门到入魔第七天——random库的使用(简单模拟斗地主发牌算法)

本文介绍了Python random库的使用,通过实例演示如何生成随机密码和模拟斗地主发牌过程。涉及函数如random(), randint(), randrange()等,并展示了如何利用这些函数创建安全的密码生成器和扑克牌洗牌发牌功能。
摘要由CSDN通过智能技术生成

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

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

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如何学会学习?

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值