Dari sudut pandang probabilitas murni, kedua pendekatan itu benar dan karenanya setara. Dari perspektif algoritmik, perbandingan harus mempertimbangkan ketepatan dan biaya komputasi.
Box-Muller bergantung pada generator yang seragam dan harganya hampir sama dengan generator yang seragam ini. Seperti yang disebutkan dalam komentar saya, Anda dapat pergi tanpa panggilan sinus atau cosinus, jika tidak tanpa logaritma:
- menghasilkan hingga S = U 2 1 + U 2 2 ≤ 1
U1,U2∼iidU(−1,1)
S=U21+U22≤1
- ambil dan tentukanX1=ZU1Z=−2log(S)/S−−−−−−−−−−√
X1=ZU1, X2=ZU2
Algoritma inversi generik membutuhkan panggilan ke invers normal cdf, misalnya qnorm(runif(N))
dalam R, yang mungkin lebih mahal daripada yang di atas dan yang lebih penting mungkin gagal di bagian ekor dalam hal presisi, kecuali fungsi kuantil dikodekan dengan baik.
Untuk mengikuti komentar yang dibuat oleh whuber , perbandinganrnorm(N)
dan qnorm(runif(N))
merupakan keuntungan dari invers cdf, keduanya dalam waktu pelaksanaan:
> system.time(qnorm(runif(10^8)))
sutilisateur système écoulé
10.137 0.120 10.251
> system.time(rnorm(10^8))
utilisateur système écoulé
13.417 0.060 13.472` `
dan dalam hal kecocokan di ekor:
Mengikuti komentar Radford Neal di blog saya , saya ingin menunjukkan bahwa default rnorm
di R menggunakan metode inversi, sehingga perbandingan di atas mencerminkan pada antarmuka dan bukan pada metode simulasi itu sendiri! Mengutip dokumentasi R di RNG:
‘normal.kind’ can be ‘"Kinderman-Ramage"’, ‘"Buggy
Kinderman-Ramage"’ (not for ‘set.seed’), ‘"Ahrens-Dieter"’,
‘"Box-Muller"’, ‘"Inversion"’ (the default), or ‘"user-supplied"’.
(For inversion, see the reference in ‘qnorm’.) The
Kinderman-Ramage generator used in versions prior to 1.7.1 (now
called ‘"Buggy"’) had several approximation errors and should only
be used for reproduction of old results. The ‘"Box-Muller"’
generator is stateful as pairs of normals are generated and
returned sequentially. The state is reset whenever it is selected
(even if it is the current normal generator) and when ‘kind’ is
changed.