Từ quan điểm xác suất hoàn toàn, cả hai cách tiếp cận đều đúng và do đó tương đương nhau. Từ góc độ thuật toán, việc so sánh phải xem xét cả độ chính xác và chi phí tính toán.
Box-Muller phụ thuộc vào một máy phát đồng nhất và có giá tương đương với máy phát đồng nhất này. Như đã đề cập trong nhận xét của tôi, bạn có thể thoát khỏi mà không cần các cuộc gọi sin hoặc cos, nếu không không có logarit:
- tạo cho đến khi S = U 2 1 + U 2 2 ≤ 1
U1,U2∼iidU(−1,1)
S=U21+U22≤1
- lấy và xác địnhX1=ZU1Z=−2log(S)/S−−−−−−−−−−√
X1=ZU1, X2=ZU2
Thuật toán đảo ngược chung yêu cầu gọi tới cdf bình thường nghịch đảo, ví dụ qnorm(runif(N))
trong R, có thể tốn kém hơn so với ở trên và quan trọng hơn là có thể thất bại về mặt chính xác, trừ khi hàm lượng tử được mã hóa tốt.
Để theo dõi các bình luận được thực hiện bởi whuber , việc so sánh rnorm(N)
và qnorm(runif(N))
là lợi thế của cdf nghịch đảo, cả về thời gian thực hiện:
> 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` `
và về mặt phù hợp ở đuôi:
Theo một bình luận của Radford Neal trên blog của tôi , tôi muốn chỉ ra rằng mặc định rnorm
trong R sử dụng phương thức đảo ngược, do đó so sánh trên là phản ánh trên giao diện chứ không phải trên chính phương thức mô phỏng! Để trích dẫn tài liệu R về 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.