Ich schreibe eine Cython-Anwendung, wo ich eine Gaußsche Zufallsvariable on-the-fly in einer engen geschachtelten Schleife generieren muss. Ich möchte dies tun, ohne irgendwelche zusätzlichen Abhängigkeiten einzuführen, z. B. bei GSL.Was ist die effizienteste und portabel Möglichkeit, Gaußsche Zufallszahlen in Cython zu generieren?
Für eine Minimalversion der Art und Weise bin ich derzeit in der Lage dies mit einheitlichen Zufall Zahlen on-the-fly zu tun:
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
Der obige Code funktional äquivalent zu numpy.random.rand ist (n) und kann mit der folgenden minimalen Setup-Datei zu erstellen:
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
diese Frage zu beantworten, was ich suche ist die gleiche Art von Minimallösung für das funktionelle Äquivalent von np.random.randn (n), wieder ideal mit jedem Die Abhängigkeit wurde aus Gründen der Portabilität direkt aus libc.stdlib importiert.
Es gibt eine Beispielimplementierung auf the Wikipedia entry for the Box-Muller algorithm, aber ich hatte Schwierigkeiten, es wegen der Art zu implementieren, wie das konstante epsilon definiert wird.
Siehe auch 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 /. Ich bin mir ziemlich sicher, dass dies ein Duplikat von einem oder mehreren davon ist. Wahrscheinlich der Erste. – DavidW
Danke für die Querverweise, @DavidW. Diese Verbindungen beziehen sich alle auf einheitliche Randome, nicht auf Gauss'sche Randome. – aph