python|100天精通Python(基础篇)——第30天(标准库random)


文章目录

  • 前言
  • 一、random库介绍
  • 二、常用函数
    • random.seed(a)
    • random.random()
    • random.uniform(a,b)
    • random.randint(a,b)
    • random.randrange(start,stop,[step])
    • random.getrandbits(k)
    • random.choice(seq)
    • random.shuffle(seq)
    • random.sample(pop,k)
  • 三、不常用函数
    • random.getstate()
    • random.setstate(state)
    • random.betavariate(alpha, beta)
    • random.expovariate(lambd)
    • random.gammavariate(alpha, beta)
    • random.gauss(mu, sigma)
    • random.normalvariate(mu, sigma)
    • random.paretovariate(alpha)
    • random.weibullvariate(alpha,beta)
  • 四、真实案例
    • 随机密码字符串
    • 计算圆周率

前言
  • 作者介绍:Python领域优质创作者、数据开发工程师
  • 励志成为Python全栈工程师,关注我发现更多精彩~
  • 本文已收录于Python全栈系列专栏:100天精通Python从入门到就业
  • 欢迎订阅,订阅专栏后可私聊进百人Python全栈交流群(手把手教学,问题解答); 还可领取80GPython全栈教程 + 300本计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
python|100天精通Python(基础篇)——第30天(标准库random)
文章图片

python|100天精通Python(基础篇)——第30天(标准库random)
文章图片

一、random库介绍
random模块实现了各种分布的伪随机数生成器。为什么称为伪随机数:即人类使用算法等方式,以一个基准(也被叫做种子,最常用的就是时间戳)来构造一系列数字,这些数字的特性符合人们所理解的随机数。但因为是通过算法得到的,所以一旦算法和种子都确定,那么产生的随机数序列也是确定的,所以叫伪随机数。
import random

二、常用函数 random.seed(a)
设置初始化随机种子,可输出相同随机数序列;a取整数或浮点数,不设置时默认以系统时间为种子
import randomprint("没有设定种子时") for i in range(5): ret = random.randint(1, 10) print(ret, end=" ") print()print("设定种子时") random.seed(1) for i in range(5): ret = random.randint(1, 10) print(ret, end=" ")

输出结果:
python|100天精通Python(基础篇)——第30天(标准库random)
文章图片

如上图可以看出:没有显式设定种子时,每次输出的随机数都是不一样的;显式设定种子时,每次输出的随机数都是一样的
random.random()
用于生成一个 0.0 到 1.0 的随机浮点数
>>> import random >>> random.random() 0.9279749775408933 >>> random.random() 0.12720379394341363 >>> random.random() 0.9391670189485866

random.uniform(a,b)
生成一个[a,b]之间的随机小数;a, b 取整数 或 浮点数
>>> import random >>> random.uniform(10.0, 20.0) 10.839441969258752 >>> random.uniform(10.0, 20.0) 12.233491150445115 >>> random.uniform(10, 20) 11.290566243261305

random.randint(a,b)
生成一个[a,b]之间的随机整数
>>> import random >>> random.randint(10,100) 100 >>> random.randint(10,100) 83 >>> random.randint(10,100) 66

random.randrange(start,stop,[step])
生成一个[start,stop)之间以step为步数的随机整数;start,stop,step取整数,step不设时默认值为1
随机生成1-100的整数:
>>> import random >>> random.randrange(1,100) 54 >>> random.randrange(1,100) 21 >>> random.randrange(1,100) 71

随机生成1-100的奇数:
>>> import random >>> random.randrange(1,100,2) 37 >>> random.randrange(1,100,2) 63 >>> random.randrange(1,100,2) 29

随机生成1-100的偶数:
>>> import random >>> random.randrange(2,100,2) 62 >>> random.randrange(2,100,2) 6 >>> random.randrange(2,100,2) 46

random.getrandbits(k)
生成一个占内存k位以内的随机整数;k取长度的整数值
>>> import random >>> random.getrandbits(10) 29 >>> random.getrandbits(10) 540 >>> random.getrandbits(10) 227

random.choice(seq)
从序列类型seq中随机返回一个元素;seq取序列类型:如字符串,列表,元组
>>> import random >>> list = ['a', 'b', 'c', 'd', 'f', 'g'] >>> random.choice(list) 'b' >>> random.choice(list) 'f' >>> random.choice(list) 'g'

random.shuffle(seq)
将序列类型中元素随机排序,返回打乱后序列,seq被改变(改变原列表),shuffle为洗牌之意; seq取序列类型:如字符串,列表,元组
>>> import random >>> list = ['a', 'b', 'c', 'd', 'f', 'g'] >>> random.shuffle(list) >>> list ['c', 'a', 'f', 'd', 'g', 'b'] >>> random.shuffle(list) >>> list ['f', 'a', 'b', 'c', 'g', 'd'] >>> random.shuffle(list) >>> list ['a', 'd', 'g', 'c', 'b', 'f']

random.sample(pop,k)
从pop中选取k个元素,以列表类型返回(不改变原列表);pop取序列类型,k取整数:代表选取个数
>>> import random >>> list = ['a', 'b', 'c', 'd', 'f', 'g'] >>> random.sample(list, 4) ['b', 'f', 'c', 'a'] >>> random.sample(list, 4) ['g', 'f', 'b', 'd'] >>> random.sample(list, 4) ['g', 'f', 'c', 'b']

三、不常用函数 random.getstate()
捕获并返回生成器当前内部状态的对象,可以把它传递给setstate()函数来把生成器内部状态恢复到调用getstate()函数之前的状态。相当于备份。
random.setstate(state)
state应为getstate()函数的结果,用来把生成器当前的内部状态恢复为state。
random.betavariate(alpha, beta)
Beta分布:参数的条件是 alpha > 0 和 beta > 0, 返回值的范围介于 0 和 1 之间。
random.expovariate(lambd)
指数分布
random.gammavariate(alpha, beta)
Gamma分布:参数的条件是 alpha > 0 和 beta > 0
random.gauss(mu, sigma)
高斯分布:mu是平均值,sigma是标准差。
random.normalvariate(mu, sigma)
正态分布:mu是平均值,sigma是标准差。
random.paretovariate(alpha)
帕累托分布:alpha是形状参数。
random.weibullvariate(alpha,beta)
威布尔分布:alpha是比例参数,beta是形状参数。
四、真实案例 随机密码字符串
字符串包括数字和字母, 可以指定密码的位数
import random import stringdef get_random_string(length): # 随机生成字母和数字的位数 num_count = random.randint(1, length - 1) letter_count = length - num_count# 随机抽样生成数字序列 num_list = [random.choice(string.digits) for _ in range(num_count)]# 随机抽样生成字母序列 letter_list = [random.choice(string.ascii_letters) for _ in range(letter_count)]# 合并字母和数字 all_list = num_list + letter_list# 乱序 random.shuffle(all_list)result = "".join([i for i in all_list]) return result# 生成10位的密码 password1 = get_random_string(10) print(password1) # 生成15位的密码 password2 = get_random_string(15) print(password2) # 生成20位的密码 password3 = get_random_string(20) print(password3)

输出结果:
41eD76F3e1 915087432k8443z 002L5292840A07284755

计算圆周率 1)圆周率的近似计算公式:
python|100天精通Python(基础篇)——第30天(标准库random)
文章图片

pi = 0 N = 100 for k in range(N): pi += 1 / pow(16, k) * (4 / (8 * k + 1) - 2 / (8 * k + 4) - 1 / (8 * k + 5) - 1 / (8 * k + 6)) print("圆周率值是:%s" % pi)

输出结果:
圆周率值是: 3.141592653589793

2)蒙特卡洛算法:
python|100天精通Python(基础篇)——第30天(标准库random)
文章图片

import randomDARTS = 1000 * 1000 * 10 hits = 0.0for i in range(1, DARTS + 1): x, y = random.random(), random.random() dist = pow(x ** 2 + y ** 2, 0.5) if dist <= 1.0: hits = hits + 1 pi = 4 * (hits / DARTS) print("圆周率值是:%s" % pi)

【python|100天精通Python(基础篇)——第30天(标准库random)】输出结果:
圆周率值是:3.14205

    推荐阅读