私はタイトなネストループでオンザフライでガウス確率変数を生成する必要があるcythonアプリケーションを作成しています。 GSLなどの余分な依存関係を導入することなくこれを行いたいと思います。Cythonでガウス乱数を生成する最も効率的で移植可能な方法は何ですか?
from libc.stdlib cimport rand, RAND_MAX
import numpy as np
cdef double random_uniform():
cdef double r = rand()
return r/RAND_MAX
def my_function(int n):
cdef int i
cdef double[:] result = np.zeros(n, dtype='f8', order='C')
for i in range(n):
result[i] = random_uniform()
return result
上記のコードはnumpy.random.randと機能的に同等である(:私は現在、オンザフライ一様乱数数字でこれを行うことができるよ道の最小限のバージョンについて
N)、および以下の最小限のセットアップファイルを指定してコンパイルすることができます。
from distutils.core import setup
from Cython.Build import cythonize
import numpy as np
setup(ext_modules=cythonize("example.pyx"), include_dirs=[np.get_include()])
# compile instructions:
# python setup.py build_ext --inplace
はこの質問に答えるために、私は何を探していますと、n個np.random.randnと同等の機能のための最小限のソリューションと同じ種類の(あります)、もう一度理想的には移植性の理由から直接libc.stdlibに依存していました。
the Wikipedia entry for the Box-Muller algorithmの実装例がありますが、一定のイプシロンが定義されているため、実装に問題がありました。
あなたはので、彼らはespilon
を定義する方法の変換ボックス・ミュラーを実装する問題があるとし
http://stackoverflow.com/questions/40976880/canonical-way-to-generate-random-numbers- in-cython、http://stackoverflow.com/questions/16138090/correct-way-to-generate-random-numbers-in-cython、http://stackoverflow.com/questions/27824959/thread-safe-random- number-generation-with-cython /。私はこれがこれらのうちの1つまたは複数の複製であると確信しています。おそらく最初のものでしょう。 – DavidW
相互参照のおかげで@DavidW。これらのリンクはすべて、ガウスのランダムではなく、均一なランダムに関係しています。 – aph