Operaciones de Python (4) módulo aleatorio y módulo de secretos

módulo aleatorio

El módulo aleatorio implementa este generador distribuido de números pseudoaleatorios. Los números aleatorios se pueden usar en matemáticas, seguridad y otros campos, y a menudo están integrados en algoritmos para mejorar la eficiencia de los algoritmos. El diseño de números aleatorios en algoritmos de aprendizaje automático La certeza es un requisito paso, y la configuración del número aleatorio afectará la calidad del algoritmo.

La función proporcionada por el módulo aleatorio es un método de enlace basado en la instancia oculta de la clase random.Random. Casi todas las funciones del módulo dependen de la función básica random(). La random()función genera números aleatorios de punto flotante uniformemente en el rango semiabierto [0.0 , 1,0). Clase Randon como una subclase, anulación  random() ,  seed() ,  getstate() y  setstate() métodos puede diseñar su propio generador aleatorio diferente.

aleatorio tiene una selección uniforme para enteros y rangos; para secuencias, los elementos aleatorios se seleccionan uniformemente, hay una función de disposición aleatoria para generar listas y una función para muestreo aleatorio sin reemplazo; para el eje de números reales, hay una función uniforme y normal funciones de distribución de cálculo (gaussiano), lognormal, exponente negativo, gamma y beta para generar distribuciones angulares. Puede utilizar la distribución de von Mises .

Función de contabilidad

función Paráfrasis
aleatorio. semilla (a = Ninguna, versión = 2) Inicialice el generador de números aleatorios. Si se omite a o Ninguno, se usa la hora actual del sistema. Si se proporciona una fuente aleatoria, se utiliza la fuente aleatoria proporcionada, y si a es de tipo int, se utiliza directamente.
aleatorio. getstate () Un objeto que captura el estado interno actual del generador aleatorio, que se puede pasar a setstate () para restaurar el estado.
aleatorio. setstate (estado) El estado se obtiene llamando a getstate (), y setstate () restaura el estado interno del generador al estado cuando se llama a getstate ()
aleatorio. bits trenzados (k) Devuelve un número entero de Python con K dígitos aleatorios. Este método se proporciona con el generador Mersenne Twister. Algunos otros generadores también se pueden proporcionar como una parte opcional de la API (Nota: Python usa Mersenne Twister como generador principal. Produce 53 dígitos de precisión Número de coma flotante, el período es 2 ** 19937-1).

Función aleatoria de enteros

función Paráfrasis
aleatorio. randrange (detener) Devuelve un número aleatorio no superior a stop
aleatorio. randrange (inicio, parada, paso) De  range(start, stop, step) devolver un elemento seleccionado al azar, es equivalente  choice(range(start, stop, step)) , pero en realidad no construye un objeto de rango. Cambiado randrange()  en la versión 3.2: es más complicado generar valores distribuidos uniformemente
aleatorio. randint (a, b) Devuelve un entero aleatorio N que satisfaga aleatoriamente a <= N <= b. Equivalente a randrange(a, b+1)
>>> import random
>>> random.randrange(100)
94
>>> random.randrange(0, 100, 3)
81
>>> random.randint(0, 10)
4

Función aleatoria de secuencia

función Paráfrasis
aleatorio. elección (seq)  Devuelve un elemento aleatorio de la secuencia no vacía  seq . Si  seq  está vacío, suba IndexError
aleatorio. opciones (población, pesos = Ninguno, *, cum_weights = Ninguno, k = 1) Seleccione el reemplazo de la población y devuelva  una lista de elementos de tamaño  k . Si la  población  está vacía, se genera un IndexError. Si se especifica una secuencia de peso, se selecciona en función del peso relativo. O, si se proporciona una  secuencia de pesos acumulados , la  elección se basa en pesos acumulativos (posiblemente mediante  itertools.accumulate() cálculos). Por ejemplo, el peso relativo es [10, 5, 30, 5]equivalente al peso acumulado [10, 15, 45, 50]. Internamente, los pesos relativos se convierten en pesos acumulativos antes de realizar una selección, por lo que proporcionar pesos acumulativos puede ahorrar esfuerzo. Si no   se especifica peso ni  cum_weights  , la selección se realiza con la misma probabilidad. Si se proporciona una secuencia de ponderaciones, debe tener la   misma longitud que la secuencia de población . weights  o  cum_weights  pueden usar cualquier  tipo numérico que interopere con el  valor random() devuelto  float(incluidos enteros, números de coma flotante y fracciones, pero no fracciones decimales)
aleatorio. barajar (x, aleatorio) Mezcla aleatoriamente la secuencia x. El parámetro opcional  aleatorio  es una función de parámetro 0 que devuelve un número de punto flotante aleatorio en [0.0, 1.0); por defecto, esta es una función  random() . Para cambiar una secuencia inmutable y devolver una nueva lista codificada, use sample(x, k=len(x)).
aleatorio. muestra (poplation, k) Devuelve una lista de longitud k de elementos únicos seleccionados de la secuencia o conjunto general  . Se utiliza para muestreo aleatorio sin repetición. Devuelve una nueva lista que contiene elementos de la población, manteniendo la población original sin cambios. La lista de resultados está organizada en orden de selección, por lo que todas las sub-secciones también serán muestras aleatorias válidas. Esto permite dividir a los ganadores de la lotería (muestras) en el gran premio y el ganador del segundo lugar (sub-porción). Para seleccionar una muestra de una serie de números enteros, use el  range() objeto como parámetro. Para el muestreo de una población grande, este método es particularmente rápido y ahorro de espacio: sample(range(10000000), k=60).
>>> random.choice(['win', 'lose', 'draw'])
'lose'
>>> deck = 'one two three foure'.split()
>>> random.shuffle(deck)
>>> deck
['three', 'two', 'one', 'foure']
>>> random.sample([23,12,45,23,45,678,34,75], k = 4)
[23, 75, 34, 23]

Función de distribución

función Paráfrasis
aleatorio. aleatorio () Devuelve un número de punto flotante aleatorio en el rango de (0.0, 1.0)
aleatorio. uniforme (a, b) Devuelve un punto flotante aleatorio  N  , cuando  a <= b el tiempo  a <= N <= b cuando el  b < a tiempo  b <= N <= a.
aleatorio. triangular (bajo, alto, modo) 返回一个随机浮点数N,使得low <= N <= high 并在这些边界之间使用指定的 mode 。 low 和 high 边界默认为零和一。 mode 参数默认为边界之间的中点,给出对称分布
random.betavariate(alpha,beta) Beta分布,参数alpha、beta都必须>0,返回的范围介于0~1之间
random.expovariate(lambd) 指数分布,lambd是1.0除以所需的平均值,非零。如果lambd为正,则返回0到正无穷;如果lambd为负,则返回负无穷到0。
random.gammavariate(alpha,beta) Gmma分布,参数alpha和beta必须>0。
random.gauss(mu,sigma) 高斯分布,mu是平均值,sigma是标准差
random.lognormvariate(mu,sigma) 对数正态分布,如果采用的是自然对数,则会得到平均值为mu,方差为sigma的正态分布,mu可以是任何职,sigma必须大于零
random.normalvariate(mu, sigma) 正态分布,mu是平均值,sigma是标准差
random.vonmisesvariate(mu, kappa) mu是平均角度,以弧度表示,介于0和2pi之间,kappa是浓度参数,必须大于或等于零,如果kappa等于零,则该分部在0到2\pi的范围内较少到均匀的随机角度。
random.paretovariate(alpha) 帕累托分布,alpha是形状参数
random.weibullvariate(alpha, beta) 威布尔分布,alpha是比例参数,beta是形状参数

Gmma分布的概率函数为:

​ $pdf(x) = \dfrac{x^{(alpha-1)}\times math.exp(\dfrac{-x}{beta})}{math.gamma(alpha)\times beta^ {alpha}}$

>>> import random
>>> random.random()
0.024784298572476104
>>> random.uniform(2.0, 5.0)
3.4259267542329748
>>> random.triangular(0.3, 1.5, 0.9)
1.1348586558465164
>>> random.betavariate(0.3, 0.25)
0.9983372793378633
>>> random.expovariate(3.0)
1.680963868987473
>>> random.gammavariate(0.25, 2.0)
0.0888430548880927
>>> random.gauss(13, 2.64)
14.755902455467584

替代随机生成器

使用os.urandom()函数的类,用从操作系统提供的源生成随机数,但这并非适用于所有的系统,也不依赖于软件的序列状态,生成的序列不可再现,因此导致seed()方法没有效果而被忽略,getstate()和setstate()函数被调用会引发NotImplementedError。因此random模块提供了替代随机生成器:

random.SystemRandom(seed)

随机序列重现问题

有的时候需要重现伪随机数生成器给出的序列,这在一些特殊情况下有着特殊的作用,通过重新使用新种子值,只要没有多个线程同时运行,相同的序列就可以在两次不同运行之间重现。

多数的随机模块算法和种子函数都会在Python版本中发生变化,但不变的方面有两个:

. 如果添加了新的生成方法,则会提供向后兼容的随机生成器

. 当兼容的生成器被赋予相同种子,生成器的random()方法将会产生相同的序列

secrets模块

虽然random模块可以生成随机数,但是并不能对生成随机数的种子、随机机制、生成的随机序列进行加密。而secrets模块就是专门用来为管理像密码、验证码、加密token等需要加密数据而生成具有非常强加密性的随机数字。

加密随机数函数

secrets模块能够提供最强的能够操作系统提供的加密随机性资源。其访问和生成函数如下:

函数 释义
secrets.SystemRandom 生成加密系统随机函数生成器
secrets.choice(sequence) 从非空序列sequence中随机返回一个元素
secrets.randbelow(n) 返回[0,n)范围内的随机数
secrets.randbits(k) 随机返回一个bit长度为k的整数

生成tokens

secrets模块为密码以及网络访问提供了生成token函数

函数 释义
secrets.token_bytes(nbytes=None) 随机返回字节数长度为nbytes值的字节形式的字符串,如果nbytes=None则使用默认的nbytes长度
secrets.token_hex(nbytes=None) 随机返回文本长度为nbytes的文本字符串,如果nbytes=None则使用默认的nbytes长度
secrets.token_urlsafe(nbytes=None) 随机返回URL-safe文本字符串,文本形式经过Base64转换,如果nbytes=None则使用默认的nbytes长度
>>> import secrets
>>> secrets.token_bytes(16)
b'\xe4\xef\x0e`\xf6k\xda\x01\xc2\xd0\x94L\x84B\xe2v'
>>> secrets.token_hex(16)
'1e702fc2ed63e4e08d2b075d62b6e782'
>>> secrets.token_urlsafe(16)
'EsZPaNvSuNKw6XpHr6xCCQ'

token字节长度问题

关于token字节长度问题过去很长一段时间没有得到明确的值,直到2015年,32个字节(256bits)长度确定为是token最能接受的高效的长度。如果想要更改token字节长度,就需要给出token的长度。

字节比较功能

secrets模块中的secrets__compare_digest__(a,b)函数可以用来进行字节或字符的比较,如果a和b是一样的,则返回Ture,如果不同则返回False

secrets 练习

>>> import string
>>> alphabet = string.ascii_letters + string.digits
>>> while True:
    password = ''.join(secrets.choice(alphabet) for i in range(10))
    if(any(c.islower() for c in password) and any(c.isupper() for c in password) and sum(c.isdigit() for c in password) >= 3):
        break

Supongo que te gusta

Origin blog.csdn.net/u010670117/article/details/115059154
Recomendado
Clasificación