2015-01-02 17 views
16

random.normalvariate()random.gauss()の違いは何ですか?pythonのrandom.normalvariate()とrandom.gauss()の違いは何ですか?

これらは同じパラメータを取り、同じ値を返し、本質的に同じ機能を実行します。

私はprevious answerからrandom.gauss()thread safeではないことを理解していますが、これはどういう意味ですか?なぜプログラマはこれを気にするべきですか?代わりに、なぜ、スレッドセーフで、スレッドセーフでないバージョンがPythonの「ランダム」に含まれていたのでしょうか?

答えて

7

実行時にスレッドセーフなコードが可能であればrace conditionsである必要があります。これにより、synchronization schemesのようなミューテックス、セマフォなどのオーバーヘッドが発生します。

ただし、リエントラントでないコードを書く場合、通常は競合条件が発生しません。つまり、少し速く実行するコードを書くことができます。これは、random.gauss()が導入された理由です。なぜなら、Pythonのdocはスレッドセーフなバージョンよりも速いと言うからです。

1

私はこれについて完全にはわかりませんが、Pythonのドキュメントではrandom.gaussが少し速いと言われていますので、スレッドセーフではない場合は少し早くすることができます。

0

マルチスレッドシステムでは、random.normalvariateを2回すばやく連続して呼び出すと、内部コードrandom.normalvariateが2回実行され、最初の呼び出しで返される可能性があります。関数の内部変数が2番目前にリセットされない可能性があり、関数出力にエラーが発生する可能性があります。

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) 

、その後、あなたはソースがどのように異なるかを確認するために、文字列のそれぞれを印刷:コード自分でを検査するために一般的には、2つのPythonの実装の違いを知るための最良の方法です。コードを簡単に見てみると、マルチスレッドのやり方だけでなく、アルゴリズムも同じではないことが示されています。

# 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

関連する問題