Da una prospettiva puramente probabilistica, entrambi gli approcci sono corretti e quindi equivalenti. Dal punto di vista algoritmico, il confronto deve considerare sia la precisione che i costi di calcolo.
Box-Muller si basa su un generatore uniforme e costa circa lo stesso di questo generatore uniforme. Come menzionato nel mio commento, puoi cavartela senza chiamate seno o coseno, se non senza il logaritmo:
- genera fino a S = U 2 1 + U 2 2 ≤ 1
U1,U2∼iidU(−1,1)
S=U21+U22≤1
- prendi e definireX1=ZU1Z=−2log(S)/S−−−−−−−−−−√
X1=ZU1, X2=ZU2
L'algoritmo di inversione generica richiede la chiamata al cdf normale inverso, ad esempio qnorm(runif(N))
in R, che può essere più costoso di quanto sopra e, cosa più importante, può fallire nelle code in termini di precisione, a meno che la funzione quantile non sia ben codificata.
A seguire i commenti di whuber , il confronto di rnorm(N)
ed qnorm(runif(N))
è a vantaggio del cdf inverso, entrambi in fase di esecuzione:
> 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` `
e in termini di adattamento nella coda:
A seguito di un commento di Radford Neal sul mio blog , voglio sottolineare che il valore predefinito rnorm
in R utilizza il metodo di inversione, quindi il confronto sopra riportato si riflette sull'interfaccia e non sul metodo di simulazione stesso! Per citare la documentazione R su 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.