Python标准库random模块处理随机数
本文详细介绍Python标准库中random模块的用法,涵盖伪随机数原理、常用生成函数(如random、uniform、randint等)及不常用的分布函数。通过代码示例演示如何生成指定长度的随机密码,并对比设置种子与不设置种子时的输出差异,帮助开发者掌握随机数处理技巧。
前言
random模块实现了各种分布的伪随机数生成器。
所谓伪随机数,是指人类通过特定算法,以基准值(通常称为种子,多采用时间戳)为基础生成的一系列数字。这些数字在统计特性上符合人们对随机数的认知。然而,一旦算法和种子固定,生成的随机数序列也就完全确定,因此被称为伪随机数。
1. 常用函数
| 常用函数 | 说明 |
|---|---|
random.seed(a) | 设置初始化随机种子,可输出相同随机数序列;a取整数或浮点数,不设置时默认以系统时间为种子 |
random.random() | 生成一个0.0到1.0之间的随机浮点数 |
random.uniform(a,b) | 生成一个[a,b]之间的随机小数,a,b取整数或浮点数 |
random.randint(a,b) | 生成一个[a,b]之间的随机整数 |
random.randrange(start,stop[,step]) | 生成一个[start,stop)之间以step为步数的随机整数;start,stop,step都是整数,step不设置默认为1 |
random.getrandbits(k)(seq) | 生成一个占内存k位以内的随机整数;k取长度的整数值 如果设置k=2,那么可取的数就在 (0,1,2,3) 之间随机取 |
random.choice(seq) | 从序列类型seq中随机返回一个元素;seq是序列类型,如:字符串、列表、元组、集合等 |
random.shuffle(seq) | 将序列类型中元素随机排序,返回打乱后的序列,seq被改变(改变原列表);seq是序列类型,如:字符串、列表、元组等 |
random.sample(pop,k) | 从pop中选取k个元素,以列表类型返回(不改变原列表);pop是序列类型,k是整数表示取k个数 |
以下是常用函数的具体使用方法:
import random
print('no seed')
for i in range(5):
ret = random.randint(1,10)
print(ret)
print()
print(random.random())
print(random.uniform(1,10))
print(random.randint(0,10))
print(random.randrange(1,10,5))
print(random.getrandbits(2))
print(random.choice([1,3,5,7,9]))
l=[1,2,3,4]
random.shuffle(l)
print(l)
print(random.sample(l,2))
print('*'*40)
print('has seed')
random.seed(1)
for i in range(5):
ret = random.randint(1,10)
print(ret)
print(random.random())
print(random.uniform(1,10))
print(random.randint(0,10))
print(random.randrange(1,10,5))
print(random.getrandbits(2))
print(random.choice([1,3,5,7,9]))
l=[1,2,3,4]
random.shuffle(l)
print(l)
print(random.sample(l,2))运行结果如下:
no seed 4 7 5 5 1 () 0.730177834774 4.05987712407 8 6 0 7 [1, 4, 2, 3] [4, 1] **************************************** has seed 2 9 8 3 5 0.449491064789 6.8643367545 8 1 0 9 [1, 3, 4, 2] [4, 1]
2. 不常用函数
random模块中还包含以下较少使用的函数:
| 函数名 | 说明 |
|---|---|
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是形状参数 |
3. 使用示例
3.1 生成随机密码
生成的密码由数字和字母组成,且可指定密码长度。
# -*- coding: utf-8 -*-
"""
@File : 随机生成密码.py
@E-Mail : zoya.zh@qq.com
"""
import random
import string
def get_random_passwd(length:int):
'''
生成随机密码h
:param length: 密码的长度
:return: 生成的随机密码
'''
num_count = random.randint(1,length-1) # 密码中数字的个数
char_count = length - num_count # 密码中字母的个数
num_list = [random.choice(string.digits) for i in range(num_count)] # 随机生成的数字
char_list = [random.choice(string.ascii_letters) for i in range(char_count)] # 随机生成的字母
psw = num_list + char_list
# 随机排列序列中的字符
random.shuffle(psw)
# 把得到的密码转成字符串的格式返回
result = ''.join(psw)
return result
if __name__ == '__main__':
psw = get_random_passwd(8)
print(psw)测试过程中,每次运行都会生成不同的密码字符串。
8oG4GW76
261Ro923
至此,关于Python标准库random模块处理随机数的介绍完毕。如需了解更多Python random模块相关内容,建议搜索本站历史文章或继续阅读后续文章。感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









