web-dev-qa-db-ja.com

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

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

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

前の回答 から random.gauss()スレッドセーフ ではないことを理解していますが、これはこのコンテキストでどういう意味ですか?なぜプログラマーはこれを気にする必要があるのですか?あるいは、Pythonの「ランダム」にスレッドセーフバージョンと非スレッドセーフバージョンの両方が含まれているのはなぜですか?

25
richnis

スレッドセーフなコードは、実行中に起こりうる 競合状態 を考慮する必要があります。これにより、ミューテックス、セマフォなどの 同期スキーム の結果としてオーバーヘッドが発生します。

ただし、再入可能でないコードを記述している場合、通常は競合状態は発生しません。つまり、基本的に、少し速く実行されるコードを記述できます。 python docによると、スレッドセーフバージョンよりも高速であるため、random.gauss()が導入されたのはこのためだと思います。

9
VHarisop

これは興味深い質問です。一般に、2つのpython実装の違いを知る最良の方法は、コードを自分で調べる:です。

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

次に、各文字列を印刷して、ソースの違いを確認します。コードをざっと見てみると、マルチスレッドごとに動作が異なるだけでなく、アルゴリズムが同じではないことがわかります。たとえば、normalvariateは、str_nvの次のコメントのように、Kinderman and Monahanメソッドと呼ばれるものを使用します。

# 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.
20

これについては完全にはわかりませんが、Pythonドキュメントには、random.gaussの方がわずかに高速であると記載されているため、スレッドセーフでなくても問題がなければ、もう少し速く進むことができます。

0
yhussain