VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > python入门教程 >
  • Python | random 模块:Python 中如何生成随机数和随机抽样?

random 是平时开发过程中常用的一个模块,该模块实现了各种分布的伪随机数生成器,以及和随机数相关的各种实用函数。基本函数 random() 在区间 [0.0, 1.0) 内均匀生成随机浮点数,是模块中几乎所有函数的基础。

Python 使用 Mersenne Twister 作为核心生成器,由于完全确定性(对于给定的初始化条件,生成的随机数序列完全确定,所以称为“伪随机数”),该模块不适用于安全或加密用途。

由于入门语言是 C 语言,所以最开始用 Python 的时候还写过 x = int(random() * a + b) 这样的憨憨代码(捂脸)。翻看文档之后才发现标准库中提供了很多便捷的函数,做个笔记记录一下。

 

目录
  • 生成整数
  • 生成实数(浮点数)
  • 序列/选择
  • 再现序列
  • 参考文献

 

生成整数#

random.randrange(stop) / random.randrange(start, stop[, step])

从 range(start, stop[, step]) 中随机选择一个整数,参数的意义与 range() 完全一致,即左闭右开。

randrange(3)		# 0, 1, 2
randrange(2, 5)		# 2, 3, 4
randrange(2, 8, 2)	# 2, 4, 6

random.randint(a, b)

最常用的随机整数方法,返回整数 N 满足 a <= N <= b。相当于 randrange(a, b+1)

生成实数(浮点数)#

除了常用的均匀分布,random 模块提供了很多种概率分布模式的随机数,对应的分布方程以及参数与数学中的命名相对应。这里只简单列出几个比较常见的。

random.random()

均匀分布,生成 [0.0, 1.0) 之间的浮点数

random.uniform(a, b)

均匀分布,生成 a 到 b 之间的浮点数(包含端点),不需要保证 a <= b

random.expovariate(lambd)

指数分布,参数 lambd != 0

random.gammavariate(alpha, beta)

Gamma 分布,alpha > 0, beta > 0

random.gauss(mu, sigma) / random.normalvariate(mu, sigma)

正态分布(高斯分布),mu - 平均值,sigma - 标准差(>0)

  • 两者功能相同,前者速度略快,后者线程安全

序列/选择#

random.choice(seq)
从非空序列 seq 返回一个随机元素。 如果 seq 为空,则引发 IndexError

random.choices(population, weights=None, *, cum_weights=None, k=1)
返回从 population 进行 k 次随机抽样结果的列表,即有重复(有放回)随机抽样。

可以指定每个元素对应的权重,如果未指定权重默认为等概率选择

  • weight 序列:指定相对权重
  • cum_weights 序列:指定累积权重
    • 例:相对权重 [10, 5, 30, 5] 相当于累积权重 [10, 15, 45, 50]
  • 如果提供了权重序列,则它必须与 population 序列的长度相同

random.shuffle(x[, random])
将序列 x 随机打乱位置。将改变 x 序列本身,而不是将新列表返回,因此传入的 x 必须是可变列表(例如 list),如果传入不可变对象(例如 tuple)会产生错误。random 是一个0参数函数,在 [0.0, 1.0) 中返回随机浮点数,默认为 random()。

由于全排列数量为阶乘增长,因此对于默认的随机数生成器,如果输入序列的长度超过 2080,那么大多数排列永远不可能出现。

random.sample(population, k, *, counts=None)
不改变原序列 population,返回序列中不重复的 k 个元素的列表,即无重复随机抽样。要从一系列整数中选择样本,建议使用 range() 对象作为参数

序列中可以包含重复的元素,重复的元素可能会被同时选中(即完全按照给定列表选择,不会进行去重)

  • (Python >= 3.9)参数 counts 可以表示重复的元素。 例如,sample(['red', 'blue'], counts=[4, 2], k=5) 等价于 sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)
>>> choice(['win', 'lose', 'draw'])	# 随机选择一个元素
'draw'

>>> choices(['red', 'black', 'green'], [18, 18, 2], k=6)	# 加权抽取6个元素(有重复)
['red', 'green', 'black', 'black', 'red', 'black']

>>> deck = 'ace two three four'.split()
>>> shuffle(deck)		# 打乱列表
>>> deck
['four', 'two', 'ace', 'three']

>>> sample([10, 20, 30, 40, 50], k=4)    # 抽取4个随机样本(无重复)
[40, 10, 50, 30]

再现序列#

有时需要重现伪随机数的序列。

random.seed(a=None)
使用种子 a(NoneType, int, float, str, bytes 或 bytearray)初始化随机数生成器,默认使用当前系统时间。通过重用一个种子值,可以在多次运行中再现相同的随机序列(不考虑多线程情况)

random.getstate() / random.setstate(state)

捕获/恢复生成器内部状态,可以在单次运行中复现随机序列

>>> status = random.getstate()
>>> random.random()
0.41528974297057974
>>> random.random()
0.5554723616955235
>>> random.setstate(status)
>>> random.random()
0.41528974297057974
>>> random.random()
0.5554723616955235

参考文献#

Python 3.9 文档 > 标准库 > 数字和数学模块

作者:Skuld_yi

出处:https://www.cnblogs.com/skuld-yi/p/14583411.html



相关教程