จากมุมมองของความน่าจะเป็นล้วน ๆ วิธีการทั้งสองนั้นถูกต้องและเทียบเท่ากัน จากมุมมองอัลกอริทึมการเปรียบเทียบจะต้องพิจารณาทั้งความแม่นยำและค่าใช้จ่ายในการคำนวณ
Box-Muller อาศัยเครื่องกำเนิดไฟฟ้าที่เหมือนกันและมีราคาเท่ากันกับเครื่องกำเนิดไฟฟ้าที่เหมือนกัน ดังที่ได้กล่าวไว้ในความคิดเห็นของฉันคุณสามารถออกไปได้โดยไม่ต้องใช้สายหรือไซน์ถ้าไม่ใช้ลอการิทึม
- สร้างจนกระทั่งS = U 2 1 + U 2 2 ≤ 1
U1,U2∼iidU(−1,1)
S=U21+U22≤1
- รับและกำหนดX1=ZU1Z=−2log(S)/S−−−−−−−−−−√
X1=ZU1, X2=ZU2
อัลกอรึทึมการกลับตัวแบบทั่วไปต้องการการเรียกใช้ cdf แบบอินเวอร์สเช่นqnorm(runif(N))
ใน R ซึ่งอาจมีค่าใช้จ่ายสูงกว่าที่กล่าวมาข้างต้นและที่สำคัญกว่าอาจล้มเหลวในก้อยในแง่ของความแม่นยำเว้นแต่ฟังก์ชันควอนไทด์
หากต้องการติดตามความคิดเห็นที่ทำโดยwhuberการเปรียบเทียบrnorm(N)
และqnorm(runif(N))
อยู่ในข้อได้เปรียบของ c ผกผันทั้งในเวลาดำเนินการ:
> 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 ใช้วิธีการผกผันดังนั้นการเปรียบเทียบข้างต้นสะท้อนให้เห็นถึงอินเทอร์เฟซไม่ใช่วิธีการจำลองเอง! หากต้องการอ้างอิงเอกสาร R บน 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.