순전히 확률론적인 관점에서, 두 접근법 모두 정확하고 따라서 동등합니다. 알고리즘 관점에서, 비교는 정밀도와 컴퓨팅 비용을 모두 고려해야합니다.
Box-Muller는 균일 한 발전기를 사용하며이 균일 한 발전기와 비용이 거의 같습니다. 내 의견에서 언급했듯이 로그가 없으면 사인 또는 코사인 호출없이 벗어날 수 있습니다.
- 생성 까지 S = U (2) (1) + U (2)
U1,U2∼iidU(−1,1)
S=U21+U22≤1
- 걸릴 와 정의Z=−2log(S)/S−−−−−−−−−−√
X1=ZU1, X2=ZU2
일반 반전 알고리즘을 사용하려면 역 정규 cdf를 호출해야합니다. qnorm(runif(N))
R에서는, 양자 함수가 잘 코딩되지 않으면, 상기보다 더 비쌀 수 있고 정밀도 측면에서 테일에서 실패 할 수있다.
에 의해 의견을 따르 whuber 의 비교 rnorm(N)
및 qnorm(runif(N))
실행 시간에 모두, 역 CDF의 장점에있다 :
> 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` `
꼬리에 맞는면에서 :
내 블로그 에서 Radford Neal 의 의견에 따라 기본 설정을 지적하고 싶습니다.rnorm
R 은 반전 방법을 사용하므로 위의 비교는 시뮬레이션 방법 자체가 아닌 인터페이스에 반영 ! RNG에 관한 R 문서를 인용하려면 :
‘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.