- images
- results
- .gitignore
- 1.1概论.ipynb
- 1.2 环境配置.pdf
- 1.3数据类型.ipynb
- 1.4 人机交互.ipynb
- 1.5 对象与变量.ipynb
- 1.6 编码与命名规范.ipynb
- 2.1 数值类型.ipynb
- 2.2 数值类型转换.ipynb
- 2.3 数值元算.ipynb
- 2.4常用数学运算函数.ipynb
- 2.5 math 模块及其应用.ipynb
- 2.6.1 逻辑值测试.ipynb
- 2.6.2 成员运算.ipynb
- 2.6.3 比较运算.ipynb
- 2.6.4 布尔运算.ipynb
- 2.6.5 运算优先级.ipynb
- 2.ipynb
- 3.1 流程控制结构.ipynb
- 3.3.1 for 循环语句.ipynb
- 3.3.3 rang.ipynb
- 3.3.3 while 循环语句.ipynb
- 3.4 and 3.5 分支结构和条件.ipynb
- 3.6 and 3.7 .ipynb
- 3.9 异常处理.ipynb
- 4 函数和模块化编程.ipynb
- 4.1 函数的定义、调用与返回值.ipynb
- 4.2 函数的参数传递.ipynb
- 4.3 变量的作用域.ipynb
- 4.4 匿名函数.ipynb
- 4.5 递归.ipynb
- 4.6 内置函数.ipynb
- 4.7 模块化程序设计.ipynb
- 5.1 序列通用操作.ipynb
- 5.1.1 索引.ipynb
- 5.1.2 切片.ipynb
- 5.1.3 序列拼接与重复.ipynb
- 5.1.4 成员测试.ipynb
- 5.2.1 字符串的创建.ipynb
- 5.2.2 字符串常量.ipynb
- 5.2.4 字符串的遍历.ipynb
- 5.2.5 文件遍历.ipynb
- 5.2.6 字符串的处理方法.ipynb
- 5.2.7 字符串格式化.ipynb
- 5.2.8 转义字符.ipynb
- 5.3 random 模块及其应用.ipynb
- 6.1 元组.ipynb
- 6.2 列表.ipynb
- 6.2.1 列表的创建.ipynb
- 6.2.2 列表的更新.ipynb
- 6.2.3 列表的删除.ipynb
- 6.2.4 列表的排序.ipynb
- 6.2.5 列表赋值与复制.ipynb
- 6.2.6 列表推导式.ipynb
- 6.2.8 常用内置函数.ipynb
- 6.2.9 列表嵌套及其排序.ipynb
- 6.3 列表综合应用.ipynb
- 7.1.1 集合的创建.ipynb
- 7.1.2可变集合类型的操作.ipynb
- 7.1.3 成员关系.ipynb
- 7.1.4 集合关系.ipynb
- 7.1.5 集合运算.ipynb
- 7.2.1 字典创建.ipynb
- 7.2.2 获取字典值.ipynb
- 7.2.3 修改字典值.ipynb
- 7.2.4内置函数与方法.ipynb
- 7.2.5字典排序输出.ipynb
- 7.3 集合与字典的应用.ipynb
- 8 中 numpy 概述.ipynb
- 8 中panda 库.ipynb
- 8.1 文件的打开与关闭.ipynb
- 8.2 文件读写操作.ipynb
- 8.3 文件的应用.ipynb
- 8.4 numpy 文件操作.ipynb
- 8.4.2 and 3.ipynb
- 8.5.1 pandas文件读写.ipynb
- 8.5.2 and 3 and 4.ipynb
- 9.1 matplotlib 线性图.ipynb
- 9.1.5 数据文化绘图.ipynb
- 9.2 非线性图.ipynb
- 9.3 词云.ipynb
- _overview.md
- _readme.ipynb
- coding_here.ipynb
- dream.png
- score.txt
- score_total.csv
- 成绩分析综合.json
5.3 random 模块及其应用.ipynb @master — view markup · raw · history · blame
random模块及其应用¶
Python中使用random模块产生各种分布的伪随机数。
使用随机数函数时,直接导入random模块即可,方法如下:
随机数生成器(种子)¶
“种子”是这个算法开始计算的第一个值。
如果随机数种子一样,那么后续所有“随机”结果和顺序也都是完全一致的。
Python语言不设置随机数种子时,解释器会使用系统时间作为种子,使每次生成的随机数不同。
当希望得到的随机数据可预测,可以设置用相同的种子,使后续产生的随机数相同。
seed 必须是下列类型之一:
NoneType、int、float、str、bytes或bytearray。
import random
# 不指定随机数种子时,每次产生的序列是不同的。
for i in range(5):
print(random.randint(1, 100), end=' ')
print()
for i in range(5):
print(random.randint(1, 100), end=' ')
print()
import random
# 用相同的随机数种子可以得到相同的序列
random.seed(10) # 用整数10做种子
for i in range(5):
print(random.randint(1, 100), end=' ')
print()
random.seed(10) # 用整数10做种子
for i in range(5):
print(random.randint(1, 100), end=' ')
| 函数 | 描述与示例 |
|---|---|
| random.seed() | 初始化随机数生成器,缺省时用系统时间做种子。seed 必须是下列类型之一: NoneType、int、float、str、bytes或bytearray。 |
| random.randint(a, b) | 产生[a,b]之间(包括b)的一个随机整数 |
| random.random() | 产生[0.0,1.0)之间的一个随机浮点数 |
| random.uniform(a, b) | 产生[a, b]之间的一个随机浮点数 |
| random.choice(seq) | 从非空序列seq中随机产生一个元素,当序列为空时,触发索引异常 |
| random.choices(population, weights=None, *, _cumweights=None, k=1) | 从population中选择替换,返回大小为 k 的元素列表。k个元素可以重复 |
| random.shuffle(x[,random]) | 将可变序列x顺序打乱 |
| random.sample(population, k) | 从列表、元组、字符串、集合、range对象等分布式序列中随机选取k个元素,不重复取, 以列表形式返回。 |
random模块的sample和choices函数都可以实现随机抽样:
sample实现无放回抽样,这意味着抽样取出的元素是不重复的;
choices实现有放回抽样,这意味着可能会重复选中某些元素。
这两个函数的第一个参数代表抽样的总体,而参数k代表样本容量,需要说明的是choices函数的参数k是一个命名关键字参数,在传参时必须指定参数名。
import random
import string
ALL_CHARS = string.digits + string.ascii_letters
def generate_code(*, code_len=4):
"""
生成指定长度的验证码
:param code_len: 验证码的长度(默认4个字符)
:return: 由大小写英文字母和数字构成的随机验证码字符串
"""
return ''.join(random.choices(ALL_CHARS, k=code_len)) # k是默认值参数,使用时需要用k=表示
# 调用函数,生成默认长度的验证码
for i in range(5):
print(generate_code())
print('字符串中可能存在重复字符') # 例如:gEeGrg,SgVjgS
# 调用函数,生成指定长度的验证码
for i in range(5):
print(generate_code(code_len=6))
import random
import string
ALL_CHARS = string.digits + string.ascii_letters
def generate_code(*, code_len=4):
"""
生成指定长度的验证码
:param code_len: 验证码的长度(默认4个字符)
:return: 由大小写英文字母和数字构成的随机验证码字符串,无重复字符
"""
return ''.join(random.sample(ALL_CHARS, code_len)) # k是位置参数,使用时直接传入数值
# 调用函数,生成默认长度的验证码
for i in range(5):
print(generate_code())
print()
# 调用函数,生成指定长度的验证码
for i in range(5):
print(generate_code(code_len=6))
模拟双色球随机选号¶
import random
RED_BALLS = [i for i in range(1, 34)] # 从1到33中随机选取6个数字作为红色球的号码
BLUE_BALLS = [i for i in range(1, 17)] # 从1到16中随机选取1个数字作为蓝色球的号码
def choose():
"""
生成一组随机号码
:return: 保存随机号码的列表
"""
selected_balls = random.sample(RED_BALLS, 6) # 从RED_BALLS中随机选取6个元素
selected_balls.sort() # 对列表中的元素进行排序
selected_balls.append(random.choice(BLUE_BALLS)) # 从BLUE_BALLS中随机选取1个元素并追加到列表中
return selected_balls # 返回生成的随机号码
def display(balls):
"""
格式输出一组号码
:param balls: 保存随机号码的列表
"""
for ball in balls[:-1]:
print(f'\033[031m{ball:0>2d}\033[0m', end=' ')
print(f'\033[034m{balls[-1]:0>2d}\033[0m')
n = int(input('生成几注号码: '))
for i in range(n):
display(choose())
用于字节数据的函数¶
import random
s = random.randbytes(6)
print(s) # b'bT\xc9@\xaf\xd8'
生成随机整数函数¶
import random
print(random.randint(0, 128)) # 随机产生一个0-128之间的整数
实例 随机产生一个身份证顺序号¶
身份证号码第十五位到第十七位为顺序码,是县级公安机关所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中奇数为男性分配码,偶数为女性分配码。随机产生一个身份证顺序号。
import random
order = random.randrange(100) # 2位整数
gender = random.randrange(0, 10, 2) # 偶数
print(f'{(str(order) + str(gender)):>03}') # 060,不足2位补0
print(f'{order:02}{gender}') # 060,不足2位补0
实例 随机产生一个IP地址¶
IP地址是互联网上的每一个网络和每一台主机分配一个逻辑地址, 这是一个32位的二进制数,通常被分割为4个“8位二进制数”。 IP地址通常用“点分十进制”表示, 例:点分十进IP地址 100.4.5.6, 实际上是32位二进制数01100100.00000100.00000101.00000110 这样的数字正好可以用getrandbits(k) 函数产生。
import random
dot = '.' # 定义一个用于分隔符的变量
for i in range(4):
n = random.getrandbits(8) # 每次产生一个8个二进制位对应的整数
if i == 3:
dot = '' # 若是最后一个数,分隔符修改为空字符串
print(n, end=dot) # 241.26.4.219
import random
dot = '.' # 定义一个用于分隔符的变量
for i in range(4):
n = random.randint(0, 255) # 每次产生一个0-255的整数
if i == 3:
dot = '' # 若是最后一个数,分隔符修改为空字符串
print(n, end=dot) # 241.26.4.219
序列用函数¶
import random
print(random.choice(['win', 'lose', 'draw'])) # 输出'draw'
pwd = ''
for i in range(8):
pwd = pwd + random.choice('') # 序列为空,IndexError: string index out of range
print(pwd)
实例 产生数字密码¶
学校的教务系统每个学期都会随机产生一个8位数字的登分密码,编程实现。
# 随机产生8个数字组成一个密码
import random
pwd = '' # 定义一个空字符串
for i in range(8): # 重复8次
pwd = pwd + random.choice('0123456789') # 每次随机产生一个数字字符,拼接到字符串上
print(pwd) # 64295542
random.choices(population, weights=None, *, cum_weights=None, k=1)
从population中选择,返回大小为 k 的元素__列表__。
既未指定 weight 也未指定 cum_weights ,则以__相等的概率__进行选择
import random
pwd = random.choices('0123456789', k=8)
print(pwd) # ['5', '1', '9', '8', '6', '7', '2', '0']
print(''.join(pwd)) # 用join()拼接为一个字符串,51986720
import random
poker = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
print(poker)
random.shuffle(poker) # 原地改变可变序列的顺序,函数无返回值
print(poker)
x必须为__可变序列__,如列表。 原地改变可变序列的顺序,函数__无返回值__
import random
poker = 'A23456789JQK' # 字符串是不可变数据,不能用shuffle()
random.shuffle(poker)
print(poker)
从列表、元组、字符串、集合、range对象等分布式序列中随机选取k个唯一元素,k不超过序列长度(k<=len(population)),用于无重复的随机抽样,以__列表__形式返回。
在将来,population 必须是一个序列。
__set 的实例将不再被支持__。 集合必须先转换为 list 或 tuple,最好是固定顺序以使抽样是可重现的。
import random
print(random.sample([10, 20, 30, 40, 50], k=4)) # 输出 [50, 10, 20, 30]
import random
pwd = random.sample('0123456789', k=8) # 返回值为列表 ['9', '8', '6', '5', '3', '1', '7', '0']
print(pwd)
print(''.join(pwd)) # 序列连接为一个字符串98653170
import random
digit = '0123456789'
pwd = random.sample('0123456789', k=len(digit)) # 打乱不可变序列,返回列表
print(pwd) # ['9', '3', '1', '4', '0', '6', '5', '8', '2', '7']
print(''.join(pwd)) # 序列连接为一个字符串9314065827
import random
pwd1 = random.sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)
pwd2 = random.sample(['red', 'blue'], counts=[4, 2], k=5) # 'red'重复4次, 'blue'重复2次
print(pwd1)
print(pwd2)
import random
print(random.sample([10, 20, 30, 40, 50], k=6)) # 样本大小大于总体大小,引发 ValueError
实例 5.10 模拟校验验证码¶
import random # 导入随机数模块
import string # 导入字符串模块
# sample()方法从包含字母与数字的字符串中随机获取6个元素,返回列表
code = random.sample(string.ascii_letters+string.digits, 6)
print(code) # ['v', '8', 'G', 'Z', 'w', '7']
vcode = ''.join(code).upper() # 列表code元素连接为字符串,字母转大写
print(vcode) # V8GZW7
check_code = input().upper() # 将输入中的字母转为大写
if check_code == vcode: # 将输入和产生的验证码进行比较
print('验证码正确')
else:
print('验证码错误,请重新输入')
实例 5.11 模拟微软序列号¶
import random # 导入随机数模块
keySn = '' # 创建一个空字符串,容纳序列号
code = 'BCEFGHJKMPQRTVWXY2346789' # 限定字符集合
for i in range(5):
s = '' # 创建空字符串,容纳序列号一节
for j in range(5): # 每次产生1个字符,5字符一组
s = s + random.choice(code) # 产生一个字符,拼接在字符串后
if i == 0: # 判断是否为第一个字符串
keySn = keySn + s # 直接拼接在字符串keySn上
else:
keySn = keySn + '-' + s # 用“-”拼接字符串
print(keySn) # EPMQW-RJFBR-T99EG-CT968-XE9PR
import random # 导入随机数模块
keySn = [] # 创建一个空列表,用于容纳序列号
code = 'BCEFGHJKMPQRTVWXY2346789' # 字符集合
for i in range(5):
s = random.sample(code, 5) # 从code中随机取5个字符
keySn.append(''.join(s)) # 将5个字符连接为字符串附加到列表
print(keySn) # ['WCMRQ', 'Y4MCR', 'BGPJ6', '3KPB9', '23RGQ']
print('-'.join(keySn))# 用‘-’将列表中的元素连接起来
算法1:蒙特卡洛模拟¶
示例5.12 蒙特卡洛法解百钱百鸡¶
import random
def monte_carlo_cock(num):
answer = []
for i in range(num):
hen = random.randint(1, 20)
cock = random.randint(1, 33)
chicken = 100 - cock - hen
if chicken % 3 == 0 and 5 * cock + 3 * hen + chicken // 3 == 100 and cock + hen + chicken == 100:
group = [cock, hen, chicken]
if group not in answer:
answer.append(group)
return answer
if __name__ == '__main__':
result = monte_carlo_cock(5000)
print(result)
示例5.13 赌徒博弈¶

# 利用以下代码分别测试每次押注500-3000时的输赢情况,会发现当玩的局数较多时,玩家总是输家。
import random
def gamble(dealer, player, bet, n):
"""接收庄家和玩家资本,每局赌资和赌局数量,返回100局后或有一方赌资输光时的资本数值"""
for i in range(n):
r = random.randint(0, 1)
if r == 1:
dealer = dealer + bet
player = player - bet
else:
dealer = dealer - bet
player = player + bet
if dealer <= 0 or player <= 0:
return dealer, player, i
else:
return dealer, player, n
if __name__ == '__main__':
dealer, player = 1000000, 10000 # 庄家和玩家的资本
n = 1000 # 每个玩家赌1000局
for bet in [500, 1000, 1500, 2000, 2500, 3000]: # 每次赌资500
result = []
for i in range(1000): # 共1000个玩家
result.append(gamble(dealer, player, bet, n))
print(f'每次押注{bet}元')
print(f'剩余筹码最大值',max([x[1] for x in result]))
print(f'剩余筹码最小值',min([x[1] for x in result]))
print('余额大于等于本金的人数',len([x[1] for x in result if x[1] >= 10000])) # 余额大于等于本金的人数
print('余额小于等于0的人数',len([x[1] for x in result if x[1] <= 0])) # 余额小于等于0的人数
print()
示例5.14 随机出题的四则运算¶
import random
def calculator(n, maximum):
"""随机产生n道正整数四则运算的题目,用户输入计算结果,
判断输入正确与否,并统计正确率。题目保证减法不出现负数."""
correct = 0
for i in range(n): # 循环n次,每次产生一个新问题
b = random.randint(0, maximum) # 随机产生一个maximum以内整数
a = random.randint(b, maximum) # 随机产生一个b到maximum以内整数,避免减法出现负数
sign = random.choice('+-*/') # 随机获取一个运算符号
print(f'{a}{sign}{b}=', end='') # 5+10=,格式化输出
result = float(input()) # 用户输入计算结果,转浮点数
if result == eval(f'{a}{sign}{b}'): # eval()将字符串转表达式并计算
print('恭喜你,回答正确')
correct = correct + 1 # 统计回答正确的题目数量
else:
print('回答错误,你要加油哦!')
print(f'答对{correct}题,正确率为{correct/n * 100}%')
if __name__ == '__main__':
num = int(input('请输入出题数量:'))
m = int(input('请输入参与计算的最大数字:'))
calculator(num, m)