how - ¿Cuál es la diferencia entre random.normalvariate() y random.gauss() en python?
random.rand python (4)
¿Cuál es la diferencia entre random.normalvariate()
y random.gauss()
?
Toman los mismos parámetros y devuelven el mismo valor, realizando esencialmente la misma función.
Entiendo por una respuesta anterior que random.gauss()
no es seguro para subprocesos , pero ¿qué significa esto en este contexto? ¿Por qué un programador debería preocuparse por esto? Planteado de forma alternativa, ¿por qué se incluyó una versión segura y no segura para subprocesos en el ''random'' de Python?
En un sistema de múltiples subprocesos, llamar random.normalvariate
a random.normalvariate
dos veces seguidas causará que el código interno de random.normalvariate
se ejecute dos veces, potencialmente antes de que la primera llamada tenga la oportunidad de regresar. Las variables internas pueden no ser restablecidas antes de la segunda función, lo que puede causar errores en la salida de la función.
Las llamadas sucesivas a random.gauss
deben esperar a que vuelvan las llamadas anteriores antes de ser llamadas.
La ventaja de random.normalvariate
es, por lo tanto, que es más rápido, pero puede producir una salida errónea.
Esta es una pregunta interesante. En general, la mejor manera de saber la diferencia entre dos implementaciones de python es inspeccionar el código usted mismo :
import inspect, random
str_gauss = inspect.getsource(random.gauss)
str_nv=inspect.getsource(random.normalvariate)
y luego imprime cada una de las cadenas para ver cómo difieren las fuentes. Un vistazo rápido a los códigos muestra que no solo se comportan de manera diferente en múltiples subprocesos, sino que los algoritmos no son los mismos; por ejemplo, normalvariate
usa algo llamado método de Kinderman y Monahan , según los siguientes comentarios en str_nv
:
# Uses Kinderman and Monahan method. Reference: Kinderman,
# A.J. and Monahan, J.F., "Computer generation of random
# variables using the ratio of uniform deviates", ACM Trans
# Math Software, 3, (1977), pp257-260.
Las piezas de código seguras para subprocesos deben tener en cuenta las posibles condiciones de carrera durante la ejecución. Esto introduce una sobrecarga como resultado de esquemas de sincronización como mutexes, semáforos, etc.
Sin embargo, si está escribiendo código no reentrante, normalmente no surgen condiciones de carrera, lo que esencialmente significa que puede escribir código que se ejecute un poco más rápido. Supongo que esta es la razón por la que se introdujo random.gauss()
, ya que el documento de python dice que es más rápido que la versión segura para subprocesos.
No estoy completamente seguro de esto, pero la documentación de Python dice que random.gauss es un poco más rápido, por lo que si estás de acuerdo con la seguridad sin hilos, puedes ir un poco más rápido.