2015-01-02 6 views
16

random.normalvariate()random.gauss()의 차이점은 무엇입니까?python에서 random.normalvariate()와 random.gauss()의 차이점은 무엇입니까?

그들은 동일한 매개 변수를 사용하고 동일한 값을 반환하므로 본질적으로 동일한 기능을 수행합니다.

나는 previous answer에서 random.gauss()thread safe이 아니라는 것을 이해하지만이 문맥에서 무엇을 의미합니까? 프로그래머가 왜 이것을 신경 써야합니까? 또 다른 이유는 파이썬의 '무작위'에 포함 된 스레드 안전하고 스레드가 안전하지 않은 버전이 모두 설치된 이유는 무엇입니까?

답변

7

스레드 안전 코드는 실행 중에 가능한 한 race conditions을 설명해야합니다. 이것은 synchronization schemes (뮤텍스, 세마포어 등)의 결과로 오버 헤드를 발생시킵니다.

그러나 재진입 코드가 아닌 코드를 작성하는 경우 일반적으로 경쟁 조건이 발생하지 않으므로 본질적으로 조금 더 빠르게 실행되는 코드를 작성할 수 있습니다. 나는 이것이 random.gauss()이 도입 된 이유라고 생각한다. 왜냐하면 파이썬 의사는 thread-safe 버전보다 빠르다고 말하기 때문이다.

1

필자는 이것에 대해 완전히 확신하지는 않지만 Python 설명서에 따르면 random.gauss가 약간 빠르기 때문에 스레드가 안전하지 않은 상태에서 정상적으로 작동하면 조금 더 빨리 갈 수 있습니다.

0

멀티 스레드 시스템에서 연속적으로 random.normalvariate을 두 번 빠르게 호출하면 random.normalvariate의 내부 코드가 두 번 실행되어 잠재적으로 첫 번째 호출이 반환 될 수 있습니다. 함수의 내부 변수가 두 번째 전에 재설정되지 않아 함수 출력에 오류가 발생할 수 있습니다.

random.gauss에 대한 후속 호출은 이전 호출이 반환되기를 기다려야 호출됩니다.

따라서 random.normalvariate의 장점은 더 빠르지 만 잘못된 출력을 생성 할 수 있습니다.

+2

이 조금 혼란 : 예를 들어, normalvariatestr_nv에서 다음과 같은 의견에 따라, Kinderman와 모나한 방법이라는 것을 사용합니다. random.gauss 및 random.normalvariate의 스레드 안전성을 혼합 했습니까? –

13

이것은 흥미로운 질문입니다.

import inspect, random 
str_gauss = inspect.getsource(random.gauss) 
str_nv=inspect.getsource(random.normalvariate) 

한 다음 소스가 어떻게 다른지 확인하기 위해 문자열의 각 인쇄 : 코드 자신에게 검사에 일반적으로 두 파이썬 구현의 차이를 알 수있는 가장 좋은 방법입니다. 코드를 살펴보면 다중 스레드와 다르게 행동 할뿐만 아니라 알고리즘도 동일하지 않다는 것을 보여줍니다.

# 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. 
+0

이런 종류의 문서를 가정 설명서에서 찾을 수 없다는 것은 슬픈 일입니다. 그 통찰력은 어떨까요? – hkBst