¡Ya ha hecho muchas observaciones correctas!
A menos que desee sembrar ambos generadores aleatorios, probablemente sea más sencillo a largo plazo elegir un generador u otro. Pero si necesita usar ambos, entonces sí, también necesitará sembrarlos a ambos, porque generan números aleatorios de forma independiente entre sí.
Porque numpy.random.seed()
, la principal dificultad es que no es seguro para subprocesos, es decir, no es seguro de usar si tiene muchos subprocesos de ejecución diferentes , porque no se garantiza que funcione si dos subprocesos diferentes están ejecutando la función al mismo tiempo. Si no está usando subprocesos, y si puede esperar razonablemente que no necesitará reescribir su programa de esta manera en el futuro, numpy.random.seed()
debería estar bien. Si hay alguna razón para sospechar que puede necesitar subprocesos en el futuro, es mucho más seguro a largo plazo hacer lo sugerido y crear una instancia local de la numpy.random.Random
clase . Por lo que puedo decir, random.random.seed()
es seguro para subprocesos (o al menos, no he encontrado ninguna evidencia de lo contrario).
La numpy.random
biblioteca contiene algunas distribuciones de probabilidad adicionales comúnmente utilizadas en la investigación científica, así como un par de funciones de conveniencia para generar matrices de datos aleatorios. La random.random
biblioteca es un poco más liviana y debería estar bien si no está haciendo investigación científica u otro tipo de trabajo en estadística.
De lo contrario, ambos usan la secuencia del tornado de Mersenne para generar sus números aleatorios, y ambos son completamente deterministas; es decir, si conoce algunos bits clave de información, es posible predecir con absoluta certeza qué número vendrá después . Por esta razón, ni numpy.random ni random.random son adecuados para usos criptográficos serios . Pero debido a que la secuencia es muy larga, ambos están bien para generar números aleatorios en los casos en los que no le preocupe que las personas intenten realizar ingeniería inversa en sus datos. Esta es también la razón de la necesidad de sembrar el valor aleatorio: si comienza en el mismo lugar cada vez, ¡siempre obtendrá la misma secuencia de números aleatorios!
Como nota al margen, si usted no necesita aleatoriedad nivel de cifrado, se debe utilizar el secretos módulo, o algo así Crypto.Random si está utilizando una versión anterior de Python que Python 3.6.
random.random
solo. Sin embargo, normalmente no necesitas esto.De Python para análisis de datos , el módulo
numpy.random
complementa Pythonrandom
con funciones para generar de manera eficiente matrices completas de valores de muestra a partir de muchos tipos de distribuciones de probabilidad.Por el contrario, el
random
módulo incorporado de Python solo muestrea un valor a la vez, mientras quenumpy.random
puede generar muestras muy grandes más rápido. Usando la función mágica de IPython,%timeit
uno puede ver qué módulo funciona más rápido:fuente
np.random.randint(2)
conrandom.randrange(2)
y NumPy fue más lento . NumPy: 1,25 us y Random: 891 ns. Y también la misma relación paranp.random.rand()
yrandom.random()
.La fuente de la semilla y el perfil de distribución utilizado afectarán las salidas; si está buscando aleatoriedad criptgráfica, la siembra desde os.urandom () obtendrá bytes aleatorios casi reales de la charla del dispositivo (es decir, ethernet o disco) (es decir, / dev / random en BSD)
esto evitará que usted dé una semilla y genere números aleatorios deterministas. Sin embargo, las llamadas aleatorias le permiten ajustar los números a una distribución (lo que yo llamo aleatoriedad científica; eventualmente, todo lo que desea es una distribución de curva de campana de números aleatorios, numpy es mejor para ejecutar esto.
Entonces, sí, quédese con un generador, pero decida qué aleatorio desea: aleatorio, pero definitivamente a partir de una curva de distribución, o tan aleatorio como pueda obtener sin un dispositivo cuántico.
fuente